題目:1007素數對猜想(20分)
讓我們定義dn為:dn=pn+1−pn,其中pi是第i個素數。顯然有d1=1,且對於n>1有dn是偶數。“素數對猜想”認為“存在無窮多對相鄰且差為2的素數”。現給定任意正整數N(<10^5),請計算不超過N的滿足猜想的素數對的個數。
輸入格式
輸入在一行給出正整數n
輸出格式
在一行中輸出不超過n的滿足猜想的素數對的個數
輸入樣例
20
輸出樣例
4

首先我們要明白怎么判斷一個數是否是素數(2,3,5,7。。。)
質數有個特點就是它總是6k-1或者6k+1,其中k為大於1的自然數
如何論證這個結論呢,其實不難。首先 6x 肯定不是質數,因為它能被 6 整除;其次 6x+2 肯定也不是質數,因為它還能被2整除;依次類推,6x+3 肯定能被 3 整除;6x+4 肯定能被 2 整除。那么,就只有 6x+1 和 6x+5 (即等同於6x-1) 可能是質數了。所以循環的步長可以設為 6,然后每次只判斷 6 兩側的數即可。
每次再判斷一個數是否為質數時只需要判斷2到根號n的數能否被n整除,如果存在可以被整除的數則為合數,否則為質數。
#include <iostream>
#include<math.h>
using namespace std;
int main()
{
int n;
cin >> n;
if (n >= 5) {//n如果小於5則不存在素數對
int k = 1;
int num = 1;//記錄素數對的個數,初值為零是因為存在3,5這個素數對
while (6 * k + 1 <= n) {
int flag = 1;
int a = 6 * k - 1;
int b = 6 * k + 1;
int a_sqrt = (int)sqrt(a);
int b_sqrt = (int)sqrt(b);
for (int i = 2;i <= a_sqrt;i++) {
if (a%i == 0) {
flag = 0;
}
}//判斷a是否為質數
for (int i = 2;i <= b_sqrt;i++) {
if (b%i == 0) {
flag = 0;
}
}//判斷b是否為質數
if (flag == 1) {
num++;
}
k++;
}
cout << num;
return 0;
}
else {
cout << 0;
return 0;
}
}
