題目鏈接 https://pintia.cn/problemsets/994805260223102976/problems/994805317546655744
讓我們定義dn爲:dn=pn+1−pn,其中pi是第i個素數。顯然有d1=1,且對於n>1有dn是偶數。“素數對猜想”認爲“存在無窮多對相鄰且差爲2的素數”。
現給定任意正整數N(<105),請計算不超過N的滿足猜想的素數對的個數。
輸入格式:
輸入在一行給出正整數N。
輸出格式:
在一行中輸出不超過N的滿足猜想的素數對的個數。
輸入樣例:
20
輸出樣例:
4
寫給自己,題目很簡單,這裏不作太多解讀,我用的是先把素數求出來,在挨個求差的方式,最大數據是105,時間是200ms,正常求素數怕超時,我用了歐拉篩法,一個O(n)的算法,其主要思想是素數的倍數是合數
C
#include <stdio.h>
#pragma warning(disable:4996)
int a[100001],b[100001],cnt=1,N;
void calc(void) //歐拉篩法
{
int i,j;
for(i=2;i<=N;i++) //i的值就是數字的值,在a數組中,用a[i]的值表示i是不是素數,a[i]==0,是素數,a[i]==1,不是素數,是素數的話存到b數組裏
{
if(a[i]==0)
b[cnt++]=i;
for(j=1;j<cnt;j++)//核心思想,素數的倍數是合數
{
if(i*b[j]>N) //如果這個倍數超了要求的數的範圍,直接break
break;
a[i*b[j]]=1; //在範圍內,則把a[n]的值賦值爲1,代表素數的倍數是合數
if(i%b[j]==0) //保證每個數只會被他的最小素數因數賦值,如4*3=6*2=12,12的值讓他最小的素數2來賦值,如果沒有這句話,那麼4*3和6*2將2次經過12,重複
break;
}
}
}
int main(void)
{
int i,res=0;
scanf("%d",&N);
calc();
for(i=1;i<cnt-1;i++)
if(b[i+1]-b[i]==2)
res++;
printf("%d",res);
return 0;
}