素数对猜想(题目作者:陈越 浙江大学)
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
首先什么是素数对?
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
我们可以用最基本的遍历方法:
bool primes(int k)
{
int count=1;
for (int i = 2; i <= k; i++)
{
if (k%i == 0)
{
++count;
if(count>2)
return false;
}
}
return true;
}
但是这样每一个数字去除很慢不是吗?
所以k不必被2~k-1之间的每一个整数去除,只需被2~√k之间的每一个整数去除就可以了。如果k不能被2~√k间任一整数整除,k必定是素数。例如判别17是是否为素数,只需使17被2~4之间的每一个整数去除,由于都不能整除,可以判定17是素数。(原因:因为如果k能被2~k-1之间任一整数整除,其二个因子必定有一个小于或等于√k,另一个大于或等于√k。例如16能被2,4,8整除,16=2*8,2小于4,8大于4,16=4*4,4=√16,因此只需判定在2~4之间有无因子即可)
以下给出C++解决方案:
#include <iostream>
#include <cmath>
using namespace std;
bool Primenum(int n)
{
for (int i = 2; i <=sqrt(n); i++)
if (n%i == 0)
return false;
return true;
}
int main()
{
int n,sum=0;
int re = 0;
int prime[100000] = {0};
cin >> n;
for (int i = 1; i <= n; i++)
if (Primenum(i))
{
prime[sum] = i;
sum++;
}
for (int i = 0; i < sum-1; i++)
if (prime[i + 1] - prime[i] == 2)
re++;
cout << re;
return 0;
}
内容原创,转载请注明出处