B-1007 素数对猜想 (20 分)

1007 素数对猜想 (20 分)

让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<10​5​​),请计算不超过N的满足猜想的素数对的个数。

输入格式:

输入在一行给出正整数N

输出格式:

在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

 

求素数的方式要选对,简单方法中最优即2~sqrt(n)内枚举(包括开头结尾)可以承受10^5内数据

2~n/2内枚举最后一组数据会超时

欧式筛法都用不到,只有10^5     不过欧式筛法:nloglogn   与根号枚举法nlogn也差不了多少   欧式筛几乎用不到了

 

代码1:(最佳最简)

#include
using namespace std;

bool isPrime(int n){
	if(n<2) return false;
	int sqr=(int)sqrt(n);
	for(int i=2;i<=sqr;i++){//枚举到n/2最后一组数据会超时 开根号是折中不快不慢的做法10**5内都能接受 
		if(n%i==0) return false; 
	}
	return true;
} 

int main(){
	//freopen("in.txt","r",stdin);
	int n,count=0;
	cin>>n;
	for(int i=2;i<=n-2;i++){//注意最后一对是n-2 n 从n-2开始封 
		if(isPrime(i)&&isPrime(i+2)) count++;
	}
	cout<

 

代码2:(不推荐,且实际耗时测试还要长些)

#include
using namespace std;
const int maxn=100000+10;

int prime[maxn]={0},pnum=0;
bool p[maxn]={0};//p[i]=0为素数 为1为合数 

//欧式筛法筛出1~n内所有素数
void Find_Prime(int n){
	for(int i=2;i<=n;i++){
		if(p[i]==0){
			prime[pnum++]=i;//被忘了将素数都记录下来啊 
			for(int j=i+i;j<=n;j+=i){
				p[j]=1;//i的倍数都标记为合数 
			}
		}
	}
} 

int main(){
	//freopen("in.txt","r",stdin); 
	int n,count=0;
	cin>>n;
	Find_Prime(n); 
	for(int i=0;i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(考研,#,算法)