題目描述
* 題目描述:數字分解,將一個數字分解成兩個質數相加
* 輸入描述:給定數字
* 輸出描述:兩個質數之和
* 輸入示例:10
* 輸出示例:10=3+7
代碼實現
/*************************************************
* 題目描述:數字分解,將一個數字分解成兩個質數相加
* 輸入描述:給定數字
* 輸出描述:兩個質數之和
* 輸入示例:10
* 輸出示例:10=3+7
* 注意事項:Linux下編譯時需要連接庫,編譯參數:-lm
*************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#define NUM_SIZE 100
int g_point = 0;
/* 判斷一個數是否爲質數(素數) */
/* 返回值:0:不是素數 1:是素數 */
int is_prime(int src)
{
int i;
/* 兩個較小數另外處理 */
if(src ==2|| src==3 )
return 1 ;
/* 不在6的倍數兩側的一定不是質數 */
if(src %6!= 1&&src %6!= 5)
return 0 ;
int tmp = sqrt( src);
/* 在6的倍數兩側的也可能不是質數 */
for(i= 5;i <=tmp; i+=6 )
{
if(src %i== 0||src %(i+ 2)==0 )
return 0 ;
}
/* 排除所有,剩餘的是質數 */
return 1 ;
}
/* 將數字分解成兩個質數 */
int div_num(int src,int* des)
{
int i;
for(i=2;i<sqrt(src);i++)
{
if(is_prime(i) && is_prime(src-i))
{
des[g_point] = i;
g_point ++;
}
}
return 0;
}
int main()
{
int input=0;
int* des;
int i;
#ifdef DEBUG
printf("[提示]:輸入一個數進行分解:");
#endif
scanf("%d",&input);
des = (int*)malloc(sizeof(int)*input);
if(NULL == des)
{
#ifdef DEBUG
printf("[Error]:malloc failed!\n\r");
#endif
return -1;
}
memset(des,0,sizeof(des));
div_num(input,des);
#ifdef DEBUG
printf(">>>>>>>>>>>> number div list <<<<<<<<<<<<<\n\r");
#endif
for(i=0;i<g_point;i++)
{
printf("%d=%d+%d\n",input,des[i],input-des[i]);
}
return 0;
}
測試描述
注意事項
編譯時,在Linux下注意編譯選項要加-lm,即鏈接數學庫。