PAT 1007 素數對猜想

2021-10-02 15:21:38 字數 1374 閱讀 6728

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

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

輸入在一行給出正整數n

在一行中輸出不超過n的滿足猜想的素數對的個數。

20
4
#include #include #include using namespace std;

#include #include #include using namespace std;

bool is_prime( unsigned long long num )

int main()

}len = primenum.size();

for(int i = 0;i < len - 1;++i)

coutcin>>input;

for(int i = 1;i <= input;++i)

}len = primenum.size();

for(int i = 0;i < len - 1;++i)

cout《將輸入的資料判斷,把素數放入到陣列內,計算二者差即可.難點在於素數的判斷.

素數判斷方法如下:

首先看乙個關於質數分布的規律:大於等於5的質數一定和6的倍數相鄰。例如5和7,11和13,17和19等等;

證明:令x≥1,將大於等於5的自然數表示如下:····· 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······可以看到,不在6的倍數兩側,即6x兩側的數為6x+2,6x+3,6x+4,由於2(3x+1),3(2x+1),2(3x+2),所以它們一定不是素數,再除去6x本身,顯然,素數要出現只可能出現在6x的相鄰兩側。這裡要注意的一點是,在6的倍數相鄰兩側並不是一定就是質數。此時判斷質數可以6個為單元快進,加快判斷速度,原因是,假如要判定的數為n,則n必定是6x-1或6x+1的形式,對於迴圈中6i-1,6i,6i+1,6i+2,6i+3,6i+4,其中如果n能被6i,6i+2,6i+4整除,則n至少得是乙個偶數,但是6x-1或6x+1的形式明顯是乙個奇數,故不成立;另外,如果n能被6i+3整除,則n至少能被3整除,但是6x能被3整除,故6x-1或6x+1(即n)不可能被3整除,故不成立。綜上,迴圈中只需要考慮6i-1和6i+1的情況,即迴圈的步長可以定為6,每次判斷迴圈變數k和k+2的情況即可。

bool isprime( int num )

引用自

PAT1007 素數對猜想

讓我們定義 dn 為 dn pn 1 pn,其中 pi 是第i個素數。顯然有 d1 1 且對於n 1有 dn 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 105 請計算不超過n的滿足猜想的素數對的個數。輸入格式 每個測試輸入包含1個測試用例,給出正整數n。輸出格式 ...

PAT 1007 素數對猜想

讓我們定義 dn 為 dn pn 1 pn,其中 pi 是第i個素數。顯然有 d1 1 且對於n 1有 dn 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 105 請計算不超過n的滿足猜想的素數對的個數。輸入格式 每個測試輸入包含1個測試用例,給出正整數n。輸出格式 ...

PAT 1007 素數對猜想

題目描述 讓我們定義 dn 為 dn pn 1 pn,其中 pi 是第i個素數。顯然有 d1 1 且對於n 1有 dn 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 105 請計算不超過n的滿足猜想的素數對的個數。輸入格式 每個測試輸入包含1個測試用例,給出正整數n。...