题目:1007素数对猜想(20分)
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<10^5),请计算不超过N的满足猜想的素数对的个数。
输入格式
输入在一行给出正整数n
输出格式
在一行中输出不超过n的满足猜想的素数对的个数
输入样例
20
输出样例
4
首先我们要明白怎么判断一个数是否是素数(2,3,5,7。。。)
质数有个特点就是它总是6k-1或者6k+1,其中k为大于1的自然数
如何论证这个结论呢,其实不难。首先 6x 肯定不是质数,因为它能被 6 整除;其次 6x+2 肯定也不是质数,因为它还能被2整除;依次类推,6x+3 肯定能被 3 整除;6x+4 肯定能被 2 整除。那么,就只有 6x+1 和 6x+5 (即等同于6x-1) 可能是质数了。所以循环的步长可以设为 6,然后每次只判断 6 两侧的数即可。
每次再判断一个数是否为质数时只需要判断2到根号n的数能否被n整除,如果存在可以被整除的数则为合数,否则为质数。
#include <iostream>
#include<math.h>
using namespace std;
int main()
{
int n;
cin >> n;
if (n >= 5) {//n如果小于5则不存在素数对
int k = 1;
int num = 1;//记录素数对的个数,初值为零是因为存在3,5这个素数对
while (6 * k + 1 <= n) {
int flag = 1;
int a = 6 * k - 1;
int b = 6 * k + 1;
int a_sqrt = (int)sqrt(a);
int b_sqrt = (int)sqrt(b);
for (int i = 2;i <= a_sqrt;i++) {
if (a%i == 0) {
flag = 0;
}
}//判断a是否为质数
for (int i = 2;i <= b_sqrt;i++) {
if (b%i == 0) {
flag = 0;
}
}//判断b是否为质数
if (flag == 1) {
num++;
}
k++;
}
cout << num;
return 0;
}
else {
cout << 0;
return 0;
}
}