一、題目:
讓我們定義dn為:dn=pn+1−pn,其中pi是第i個素數。顯然有di=1,且對於n>1有dn是偶數。“素數對猜想”認為“存在無窮多對相鄰且差為2的素數”。
現給定任意正整數N(<105),請計算不超過
N
的滿足猜想的素數對的個數。
二、輸入格式:
輸入在一行給出正整數N
。
輸出格式:
在一行中輸出不超過N
的滿足猜想的素數對的個數。
三、輸入樣例:
20
輸出樣例:
4
四、設計思路:
由於題目的要求是相鄰且相差為二的素數,所以我們可以直接令前面一個數為i,后面一個數就為i+2,
然后判斷這兩個數是否都是素數,如果是的話,那么統計素數對的變量就加1;外面再嵌套一個do-while
循環就ok了,注意循環的終止條件是i+2<=num,而不是i<=num,如果是i<=num的話,那么可能就會越界,
不滿足題目的要求,還有一點就是在素數的判斷的函數中,如果將判斷素數的循環條件變為以下代碼:
for(i=2;i<num;i++)
if(num%i==0){flag=0;break;}
雖然最后的結果不會出現問題,但是對程序的時間復雜度會有很大的影響,我在網上做這道題時最開始就是這么寫的,
由於那個網站的對程序運行的時間有限制,所以這樣寫就不能通過,需要改善代碼降低時間復雜度才能通過,於是
我就想對素數判斷的函數的循環進行改進,本質上就是減少了循環的次數,改進后的代碼如下:
for(i=2;i<=sqrt(num);i++)if(num%i==0){flag=0;break;}
五、完整代碼:
#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; }
六、輸出效果: