PAT-1007素数对猜想

Posted chance-zou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT-1007素数对猜想相关的知识,希望对你有一定的参考价值。

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




以上是关于PAT-1007素数对猜想的主要内容,如果未能解决你的问题,请参考以下文章

PAT B1007 素数对猜想 (20 分)

PAT:1007

1007. 素数对猜想

1007. 素数对猜想 (20)

1007. 素数对猜想 (20) Java

自测-2 素数对猜想 (20 分)—— 数据结构-起步能力自测题