1. 程式人生 > >自測-2 素數對猜想(20 分)

自測-2 素數對猜想(20 分)

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

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

輸入格式:

輸入在一行給出正整數N

輸出格式:

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

輸入樣例:

20

輸出樣例:

4

思路:可以先定義一個數組作用是記錄從1到n的所有素數,然後再看a[i+1]-a[i]的值是不是滿條件即可。但需要注意的是n最大為100000,所以要選取適合的判斷一個數是不是素數的方法:

1、首先我們知道1不是素數可以不用考慮,2是素數也先不管,所以這樣來判斷一個數n是不是素數:

for(i=2;i<n;i++)
{
    if(n%i==0)
    {
        printf("這不是一個素數");
        break;
    }
}

2、通過一個數的sqrt(n)來判斷,即:

 for(j=2; j<=sqrt(n); j++)
        {

            if(i%j==0)
            {

                printf("這不是一個素數");
                break;
            }

        }

很顯然第二種判別方法是最快的,而選用第一種方法的時候就會tle了。

AC程式碼如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,i,j,flag,k,sum=0,w=0;
    int a[112345];
    a[0]=2;
    scanf("%d",&n);
    for(i=3; i<=n; i++)
    {
        flag=1;
        k=sqrt(i);
        for(j=2; j<=k; j++)
        {

            if(i%j==0)
            {

                flag=0;
                break;
            }

        }
        if(flag)
        {
            a[++w]=i;
        }

    }
    for(i=0; i<=w; i++)
    {
        if(a[i+1]-a[i]==2)
        {
            sum++;
        }
    }
    printf("%d",sum);
}