1007 素数对猜想 (20 分)

题目: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;
	}
}

参考文献:https://blog.csdn.net/afei__/article/details/80638460

posted @ 2019-01-06 12:45  Chance-Zou  阅读(2514)  评论(0编辑  收藏  举报