1007 素数对猜想(20 分)
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
参考代码:
#include<iostream>
#include<cmath>
using namespace std;
bool judge(int m)
{/*首先写出判断素数的程序*/
double k = sqrt(double(m));
int i;
if(m==1)
return false;
for (i= 2; i <= int(k + 1); i++)
{
if (m%i == 0)
{
break;
}
}
if (i >= int(k + 1))
return true;
else
return false;
}
int main()
{
int n;
cin >> n;
int *a = new int[n];
int count = 0;
int result = 0;
for (int i = 1; i <= n; i++)//找到不大于所输入的数的的所有素数
{
if (judge(i))
{
a[count] = i;
if (count != 0)
{
if ((a[count] - a[count - 1]) == 2)
result++;
}
count++;
}
}
cout << result;
delete[]a;
return 0;
}
判断素数的方法有三种,参考代码用的是最快的。其他两种均会造成运行超时(在oj系统中,当所输入的数非常大时,会造成超时)。平时写代码时,尽量选择最快的算法。三种素数判别方法罗列如下(当数字足够大,三段程序运行时间应该依次增加):
bool judge(int m)
{/*首先写出判断素数的程序*/
double k = sqrt(double(m));
int i;
if(m==1)
return false;
for (i= 2; i <= int(k + 1); i++)
{
if (m%i == 0)
{
break;
}
}
if (i >= int(k + 1))
return true;
else
return false;
}
bool judge(int m)
{/*首先写出判断素数的程序*/
if (m == 1)
return false;
for (int i= 2; i <= m/2; i++)
{
if (m%i == 0)
{ return false;
}
}
return true;
}
bool judge(int m)
{/*首先写出判断素数的程序*/
for (int i= 2; i < m; i++)
{
if (m%i == 0)
{ return false;
}
}
return true;
}