自測-2 素數對猜想(20 分)
阿新 • • 發佈:2019-01-04
讓我們定義dn為:dn=pn+1−pn,其中pi是第i個素數。顯然有d1=1,且對於n>1有dn是偶數。“素數對猜想”認為“存在無窮多對相鄰且差為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); }