让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
解题思路:这道题最重要的就是把题目的意思理解懂,题目定义了一个素数对的式子,但最后要我们求的实际上就是输入一个正整数n,在不超过n的正整数中找出所有的素数并且相邻的两个素数之差为2。
题目给了20,最终的答案给出的素数对为4,从2到20素数为3、5、7、11、13、17、19
满足题意的素数对为(3,5),(5,7),(11,13),(17,19)故输出4。
理解了题意之后就可以开始编程了。 但在提交代码的过程中我发现前几个测试点很容易能正确,但是最后一个测试点会出现运行超时的问题,可能这最后一个测试点提交了一个很大的数,使用原来的方法时间过长,超出200ms的限制了,所以我对代码进行了修改,在判断一个正整数是否为素数的时候无需从2遍历到n,只需要遍历到根号n即可,因为一个数如果不能被2到根号n的数字整除,那他一定不可能会被根号n到n的数整除。修改完毕再次提交成功解决了这个运行超时的问题。
#include<iostream>
#include<cmath>
using namespace std;
int isSushu(int n) //判断一个正整数n是否为素数
{
for(int i =2;i<=sqrt(n);i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int main()
{
int n;
cin>>n;
int count = 0; //素数对个数
int A[10000]; //A数组用来存储所有的素数
int k=0;
for(int i=2;i<=n;i++) //计算从2到n的所有素数,保存在数组A中
{
if(isSushu(i)==1)
A[k++]=i;
}
for(int i=0;i<k-1;i++) //遍历A数组,若相邻两个素数之差为2则满足题意,count+1
{
if(A[i+1]-A[i]==2)
count++;
}
cout<<count;
}