分析:
如果两个数是素数对,那么差值肯定是二,而且从5 开始才出现第一对。
#include<bits/stdc++.h>
using namespace std;
bool f(int x){//判断素数
for(int i=2;i*i<=x;i++){
if(x%i==0)
return false;//不是素数
}
return true;//是素数
}
int main(){
int n,num=0;
cin>>n;
for(int i=5;i<=n;i++){//从5开始才出现第一对3、5
if(f(i)&&f(i-2))//要是素数对,差值肯定为二
num++;
}
cout<<num;
return 0;
}
下面这种方法是看到博主日沉云起的做法,利用埃氏筛法减少选素数的时间复杂度
#include<bits/stdc++.h>
using namespace std;
vector<int>prime;
void findPrime(){//埃氏筛法求解100005以内的素数表
vector<bool>number(100005,true);
for(int i=2;i<number.size();++i)
if(number[i]){//如果是素数
prime.push_back(i);//加入prime中
for(int j=i+i;j<number.size();j+=i)//将数组number中下标凡是i的倍数的均置为false,表示不是素数
number[j]=false;
}
}
int main(){
int N,count=0;
scanf("%d",&N);
findPrime();
for(int i=1;prime[i]<=N;++i)
if(prime[i]-prime[i-1]==2)
++count;
printf("%d",count);
return 0;
}