PAT-1007素數對猜想
阿新 • • 發佈:2019-01-06
題目: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; } }