1. 程式人生 > >PAT-1007素數對猜想

PAT-1007素數對猜想

題目: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;
    }
}

參考文獻:https://blog.csdn.net/afei__/article/details/80638460