華爲機試——將一個數分解成兩個質數之和

題目描述

* 題目描述:數字分解,將一個數字分解成兩個質數相加
* 輸入描述:給定數字
* 輸出描述:兩個質數之和
* 輸入示例: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,即鏈接數學庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章