让我们定义dnd_ndn为:dn=pn+1−pnd_n = p_{n+1}-p_ndn=pn+1−pn,其中pip_ipi是第iii个素数。显然有d1=1d_1 = 1d1=1,且对于n>1n>1n>1有dnd_ndn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105<10^5<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
解题思路:先用Eratosthenes筛法筛选出素数,再判断两个相邻素数差是否为2
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn = 1e5+5;
/*用Eratosthenes筛法筛选出素数*/
void prime(int *vis,int n){
int m =sqrt(n + 0.5);
memset(vis , 0, sizeof(vis));
for(int i = 2;i <= m; i++) if(!vis[i])
for(int j = i*i; j <= n; j += i)
vis[j] =1;
}
int main()
{
int n;
cin >>n;
int vis[maxn], a[maxn];
prime(vis , n);
int j=0;
for(int i = 3;i <= n; i++)
if(!vis[i]) a[j++]=i;
int sum =0;
for(int k = 1;k < j; k++)
if(a[k] - a[k-1] == 2){
sum += 1;
}
cout << sum << endl;
return 0;
}