1007. 素数对猜想 (20)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。
输入格式:每个测试输入包含1个测试用例,给出正整数N。
输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:20输出样例:
4
这题其涉及两个问题,首先是如何判断一个数为素数;然后,再按这题的逻辑,素数对猜想的问题。
首先是如何判断一个数是否为素数。网上各种各样好多的方法,感觉可以参考http://blog.csdn.net/arvonzhang/article/details/8564836
一、判断一个数是否为素数。
逻辑可以很简单,也可以很复杂,其实我在做这个题的时候,是绕了圈子,没有得到满分,原因就是素数判断的地方,对于比较大的数,耗时太长了。下面是我的代码
bool IsPrime(int n)//判断一个数是否为素数
{
if (n < 2)
{
throw 0;
}
else
{
int num = 0;
for (int i = 2; i <= n/2+1; i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
}
这里我用的是,如果一个数不能被小于它一半的所有数整除,那么后面一半的数也不能被它整除,这样比直接对n进行循环,会减少一半的计算量。但是在PAT提交的时候,还是超时被扣了两分。
下面的方法比较简单易懂,且效率也会高很多
bool IsPrime(int n)
{
if (n == 1 || n == 0)
return false;
if (n == 2)
return true;
int tmp = (int)sqrt((double)n);//注意这里判断是否为素数的方法
for (int i = 2; i <= tmp; i++)
if (n%i == 0)
return false;
return true;
}
最后调用该函数即可实现
int main()
{
int n;
cin >> n;
vector<int> Sushus;
if (n < 5)
{
cout << 0;
}
else
{
for (int i = 2; i <= n; i++)
{
if (IsPrime(i))
{
Sushus.push_back(i);
}
}
int count = 0;
for (int j = 1; j < Sushus.size(); j++)
{
if (Sushus[j] - Sushus[j - 1] == 2)
{
count++;
}
}
cout << count;
}
return 0;
}
其实还有一种更简单的逻辑(我自己真的是把这个问题想复杂了,要锻炼自己学会简单思考的方式)
int main()
{
int num, count = 0;
cin >> num;
for (int i = 3; i <= num - 2; i++)
{
if (IsPrime(i) && IsPrime(i + 2))
count++;
}
cout << count << endl;
}
完整程序的前面记得加上头文件和using namespace std;