00-自測2. 素數對猜想 (20)

讓我們定義 dn 爲:dn = pn+1 - pn,其中 pi 是第i個素數。顯然有 d1=1 且對於n>1有 dn 是偶數。“素數對猜想”認爲“存在無窮多對相鄰且差爲2的素數”。

現給定任意正整數N (< 105),請計算不超過N的滿足猜想的素數對的個數。

輸入格式:每個測試輸入包含1個測試用例,給出正整數N。

輸出格式:每個測試用例的輸出佔一行,不超過N的滿足猜想的素數對的個數。

輸入樣例:
20
輸出樣例:
4

我做做個題的思路是:

       用篩選法,先篩選出題目中要求的數據內(1-100,00)素數存入一個數組Prime_num.  然後找到輸入N的位置,

    對於N之前的素數進行遍歷,求出滿足要求的素數對的個數

其實我覺得可以再優化一下,先輸入N,然後再去構建那個指數表(只用1-N即可),這樣可以節省空間、時間

#include <stdio.h>
#include <math.h>
#define RANGE 100001
int main(int argc, const char* argv[])
{
	int Prime_num[RANGE];
	int i, j;
	
	// 賦值,之後進行篩選法求素數 
	for(i = 1; i < RANGE; i++)
		Prime_num[i] = i;
		
	// 從2開始到sqrt(RANGE)作爲因子
	for(i = 2; i < sqrt(RANGE); i++)
		for(j = i + 1; j <= RANGE; j++)// 篩選因子之後的數
			if(Prime_num[i] != 0 && Prime_num[j] != 0)
				if(Prime_num[j] % Prime_num[i] == 0)
					Prime_num[j] = 0;	// 一旦被整除,就挖去 
	int cnt = 0;
	for(i = 0; i < RANGE; i++)
		if(Prime_num[i] != 0)
		{
			Prime_num[cnt] = Prime_num[i];
			cnt ++;
		}
	// 檢查數組中的質數是否正確	
//	{
//		for(i = 0; i <= cnt; i++)
//		{
//			printf("%5d", Prime_num[i]);
//			if(i % 10 == 0)
//				printf("\n");
//		}
//	}		
		
	
	int N, max, max_loc;
	scanf("%d", &N); 
	
//	// 找出輸入數的位置及最大的質數 
//	for(i = 1; i < cnt; i++)
//	/*
//		此處的if判斷有問題,因爲數組裏最大的質數(9973)比100000小
//		所以,輸入N = 100000時,就找不到那個質數及其位置 
//	*/
//		if(Prime_num[i] > N) 
//		{
//			max = Prime_num[i-1];
//			max_loc = i - 1;
//			break;
//		}
	max = Prime_num[cnt - 1];
	max_loc = cnt - 1;
	for(i = 1; i < cnt; i++)
		if(N < Prime_num[i])
		{
			max = Prime_num[i - 1];
			max_loc = i - 1;
			break;
		}
	/*
		有個檢驗方法代碼是否考慮到邊界的方法:
			因爲最大的質數爲9973,所以輸入比9973大的數字,結果都是一致的 
	*/
	
	cnt = 0;
	for(i = 1; i < max_loc; i++)
	{
		if(Prime_num[i+1] - Prime_num[i] == 2)
			cnt ++;
	}
	printf("%d\n", cnt);
	
	return 0;
}



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