zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    on和where的区别
    分组查询 group by having 排序 order by asc(升序)或desc(降序)
    连接查询 left join on, union
    md5加密方法
    where查询条件的指定,between and,in,like
    Mapnix(转) Anny
    Rolebased access control(RBAC) Anny
    TestComplete如何识别对象(转) Anny
    Jira workflow Anny
    crx文件 Anny
  • 原文地址:https://www.cnblogs.com/chance-zou/p/10228362.html
Copyright © 2011-2022 走看看