PAT乙級 1007 素數對猜想(歐拉篩法)

題目鏈接 https://pintia.cn/problemsets/994805260223102976/problems/994805317546655744

讓我們定義d​n​爲:dn=pn+1−pn,其中pi​​是第i個素數。顯然有d​1​​=1,且對於n>1有d​n​​是偶數。“素數對猜想”認爲“存在無窮多對相鄰且差爲2的素數”。
現給定任意正整數N(<10​5​​),請計算不超過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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章