问题描述:
让我们定义dn 为:dn =pn+1−pn,其中pi 是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<10^5 ),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
思路1:
1.求出给定正整数的所有素数并存进数组中
2.对满足dn = pn+1 - pn 的dn计数
这题本来很简单的,但是时间限制是两秒钟,根据上面的思路让我想了好多种方法,但还是超时错误。
如下所示:
//求解素数
for (int i = 2 ; i <= number ; i++ )
{
int j = 2;
while (j < i && i % j != 0) //没有公共质因子
{
j++;
}
if (i == j)
{
vec.push_back(i);
if (vec.size() > 1)
{
if ((vec[1] - vec.front()) == 2)
{
count++;
}
vec[0] = vec[1];
vec.pop_back();
}
}
}
思路二:从5到给定正整数的范围区间[5,正整数],判断第i个正整数和第i+2个正整数是否为素数,并且差为2。但还是有一个测试time limited.
#include <iostream>
int main()
{
int number;
std::cin >> number;
int count = 0;
int prim = 3;
for (int i = 5; i <= number; i += 2)
{
int j;
for ( j = 2; j < i; j++)
{
if (i % j == 0)
{
break;
}
}
if (j == i)
{
if ((i - prim) == 2)
{
count++;
}
prim = i;
}
}
std::cout << count << std::endl;
return 0;
}
然后呢想到下面那个:使用bool数组记录已经验证过的不是素数的正整数。
#include <cstdio>
int main()
{
const int maxN = 100000;
bool p[maxN] = { 0 };
//n为待验证的正整数,primer为上一个素数,k为素数对计数
int n, primer = 0, k = 0;
scanf("%d", &n);
for (int i = 2; i <= n; ++i)
{
//还没验证是否为素数的正整数才验证
if (!p[i])
{
for (int j = i + i; j < n; j += i)
{
p[j] = true; //已经确定不是素数的正整数
}
if (primer != 0 && i - primer == 2)
{
++k;
}
primer = i;
}
}
printf("%d\n", k);
return 0;
}