让我们定义
d
n
d_n
dn为:
d
n
=
p
n
+
1
+
1
−
p
n
d_n =p_{n+1}+1−p_n
dn=pn+1+1−pn,.其中
p
n
p_n
pn是第i个素数。显然有
d
1
d_1
d1=1,且对于
n
>
1
n>1
n>1有
d
n
d_n
dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数
N
<
1
0
5
N<10^5
N<105,请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
结尾无空行
输出样例:
4
结尾无空行
分析:
可以先把n以内的素数表求出来,这里用了一个埃氏筛,然后把素数给存入栈中,通过顶数减下一个数计算差值,如果值为2就在一开始定义的一个存储对数的变量cp上加一。代码如下:
#include <iostream>
#include <stack>
using namespace std;
int main(){
int n;
cin>>n;
int cp=0;
bool *isnp = (bool *)malloc(n*sizeof(bool));
for(int i = 0; i <= n; i++){
isnp[i] = false;
}
for (int i = 2; i * i <= n; i++)//建立素数组(埃氏筛)
if (!isnp[i]){
for (int j = i * i; j <= n; j += i){
isnp[j] = true;
}
}
stack<int> st;
for(int i=1;i<=n;i++)
if(!isnp[i])st.push(i);
while(!st.empty()){
int frontn=st.top();
st.pop();
if(st.empty())break;
if((frontn-st.top())==2){
cp++;
}
}
cout<<cp;
}