讓咱們定義dn爲:dn=pn+1−pn,其中pi是第i個素數。顯然有di=1,且對於n>1有dn是偶數。「素數對猜測」認爲「存在無窮多對相鄰且差爲2的素數」。markdown
現給定任意正整數N(<105),請計算不超過
N
的知足猜測的素數對的個數。函數
輸入在一行給出正整數N
。網站
在一行中輸出不超過N
的知足猜測的素數對的個數。spa
20
4
設計思路:
因爲題目的要求是相鄰且相差爲二的素數,因此咱們能夠直接令前面一個數爲i,後面一個數就爲i+2,設計
而後判斷這兩個數是否都是素數,若是是的話,那麼統計素數對的變量就加1;外面再嵌套一個do-whilecode
循環就ok了,注意循環的終止條件是i+2<=num,而不是i<=num,若是是i<=num的話,那麼可能就會越界,blog
不知足題目的要求,還有一點就是在素數的判斷的函數中,若是將判斷素數的循環條件變爲如下代碼:io
for(i=2;i<num;i++)class
if(num%i==0){flag=0;break;}
雖然最後的結果不會出現問題,可是對程序的時間複雜度會有很大的影響,我在網上作這道題時最開始就是這麼寫的,
變量
因爲那個網站的對程序運行的時間有限制,因此這樣寫就不能經過,須要改善代碼下降時間複雜度才能經過,因而
我就想對素數判斷的函數的循環進行改進,本質上就是減小了循環的次數,改進後的代碼以下:
for(i=2;i<=sqrt(num);i++)if(num%i==0){flag=0;break;}
5、完整代碼:
#include<stdio.h> #include<math.h> int JudgePrimeNum(int num); int main() { int num; int i=1; int flag=0; scanf("%d",&num); do { if(JudgePrimeNum(i)==1&&JudgePrimeNum(i+2)==1) flag=flag+1; i++; } while (i+2<=num); printf("%d",flag); return 0; } //判斷數字是否爲素數 int JudgePrimeNum(int num) { int flag=1; if(num==1){ flag=0; } else if(num==2||num==3){ flag=1; } else{ int i; for(i=2;i<=sqrt(num);i++) if(num%i==0){ flag=0; break; } } return flag; }