素數對猜想


一、題目:

  題目鏈接

  讓我們定義d​n​​為:d​n​​=p​n+1​​−p​n​​,其中p​i是第i個素數。顯然有d​i​​=1,且對於n>1有d​n​​是偶數。“素數對猜想”認為“存在無窮多對相鄰且差為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;
}

 

六、輸出效果:

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM