1. 程式人生 > >HDOJ,數論簡單入門題目,杭電1262,尋找素數對

HDOJ,數論簡單入門題目,杭電1262,尋找素數對

這個查結果的思想比較精妙吧。。。。

/***** HDOJ 1262 尋找素數對 ********/

/******** written by C_Shit_Hu ************/

/****************************************************************************/
/* 
一個數論的入門題目

哥德巴赫猜想大家都知道一點吧.我們現在不是想證明這個結論,
而是想在程式語言內部能夠表示的數集中,
任意取出一個偶數,來尋找兩個素數,使得其和等於該偶數.
做好了這件實事,就能說明這個猜想是成立的.
由於可以有不同的素數對來表示同一個偶數,所以專門要求所尋找的素數對是兩個值最相近的.

Input
輸入中是一些偶整數M(5<M<=10000)

Output
對於每個偶數,輸出兩個彼此最接近的素數,其和等於該偶數.

*/
/****************************************************************************/


// 簡單的數論題目,不過其中的中間值向外擴充套件的思想值得借鑑

#include <stdio.h>
#include <string.h>
#include <math.h>

// 素數判定呼叫函式
int Judge(int a)
{
	int j;
	for(j=2; j<=sqrt(a); j++)
	{
		if(a % j == 0)
			return 0;  // 如果除一和本身外有約數,則不是素數
	}
	return 1;
}

int main()
{
	int m, half, i;
	
	while(scanf("%d",&m) != EOF)
	{
		half = m / 2;
		for(i=half; i>0; i--)
		{
            // 理解此處的half的精妙之處:由於是求兩個數,而且這兩個數最接近而且他們的和為m,
			// 於是就將m從均分,然後兩個數字同時向首尾擴散,判斷是否同時為素數,若是,則輸出
			int temp = half * 2 - i;
			if(Judge(i) && Judge(temp))
			{
				printf("%d %d\n", i, temp);
				break;
			}
		}
	}
	return 0;
}


/******************************************************/
/********************  心得體會  **********************/
/*
  這個,考察的不難,但是要是精妙的演算法,程式碼讓人賞心悅目!!!

  水水更健康!!!
*/
/******************************************************/