1007 素数对猜想(20 分)通俗详解

本题链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805317546655744

让我们定义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

分析:

本题核心算法的实现并不难,但是算法策略不同会导致不同的结果。你很可能会有一个点超时。超时怎么办?有两种方案,方案1是我们注意到题目N的上限是10万,于是先求出10万以内的素数存入数组中,再根据数组下标访问各个素数。方案2是每算出1个素数,和前一个素数作差并判定,我推荐方案2,因为不需要受N的限定且当N不大时耗时很少。

 

代码(方案1):

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int i,j,cnt=1;
	int p[100000];
	bool isnum;
	p[1]=2;
	for(i=3;i<=100000;i++)
	{
		isnum=true;
		for(j=2;j<=sqrt(i);j++)
		if(i%j==0)
		{
			isnum=false;
			break;
		}
		if(isnum)
		p[cnt++]=i;
	}
	cnt=0;
	int n;
	cin>>n;
	for(int i=1;p[i+1]<=n;i++)
	if(p[i+1]-p[i]==2)
	cnt++;
	cout<<cnt;	
	return 0;
}

 

代码(方案2):

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int i,j,cnt=0;
	int pre=2;
	for(i=3;i<=n;i++)
	{
		for(j=2;j<=sqrt(i);j++)
		if(i%j==0)
		break;
		if(j>sqrt(i))
		{
			if(i-pre==2)
			cnt++;
			pre=i;
		}
	}
	cout<<cnt;	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37729102/article/details/81607953