現給定任意正整數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;
}