素數對猜測

1、題目:

  讓咱們定義d​n​​爲:d​n​​=p​n+1​​−p​n​​,其中p​i是第i個素數。顯然有d​i​​=1,且對於n>1有d​n​​是偶數。「素數對猜測」認爲「存在無窮多對相鄰且差爲2的素數」。markdown

  現給定任意正整數N(<105),請計算不超過N的知足猜測的素數對的個數。函數

2、輸入格式:

    輸入在一行給出正整數N網站

   輸出格式:

    在一行中輸出不超過N的知足猜測的素數對的個數。spa

3、輸入樣例:

   20

  輸出樣例:

  4

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;
}

 

6、輸出效果:

相關文章
相關標籤/搜索