题目链接 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,如果没有这句话,那么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;
}