码迷,mamicode.com
首页 > 其他好文 > 详细

PAT-1007素数对猜想

时间:2019-01-06 13:38:25      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:math.h   题目10   tps   space   依次   iostream   tail   names   for   

题目: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素数对猜想

标签:math.h   题目10   tps   space   依次   iostream   tail   names   for   

原文地址:https://www.cnblogs.com/chance-zou/p/10228362.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!