素数对猜测

1、题目:

  让咱们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i是第i个素数。显然有d​i​​=1,且对于n>1有d​n​​是偶数。“素数对猜测”认为“存在无穷多对相邻且差为2的素数”。markdown

  现给定任意正整数N(<105),请计算不超过N的知足猜测的素数对的个数。函数

2、输入格式:

    输入在一行给出正整数N网站

   输出格式:

    在一行中输出不超过N的知足猜测的素数对的个数。spa

3、输入样例:

   20

  输出样例:

  4

4、设计思路:

   因为题目的要求是相邻且相差为二的素数,因此咱们能够直接令前面一个数为i,后面一个数就为i+2,设计

  而后判断这两个数是否都是素数,若是是的话,那么统计素数对的变量就加1;外面再嵌套一个do-whilecode

  循环就ok了,注意循环的终止条件是i+2<=num,而不是i<=num,若是是i<=num的话,那么可能就会越界,blog

  不知足题目的要求,还有一点就是在素数的判断的函数中,若是将判断素数的循环条件变为如下代码:io

  for(i=2;i<num;i++)class

            if(num%i==0){
                flag=0;
                break;
            }

  虽然最后的结果不会出现问题,可是对程序的时间复杂度会有很大的影响,我在网上作这道题时最开始就是这么写的,
变量

  因为那个网站的对程序运行的时间有限制,因此这样写就不能经过,须要改善代码下降时间复杂度才能经过,因而

  我就想对素数判断的函数的循环进行改进,本质上就是减小了循环的次数,改进后的代码以下:

  for(i=2;i<=sqrt(num);i++)
            if(num%i==0){
                flag=0;
                break;
            }

   

5、完整代码:

 

#include<stdio.h>
#include<math.h>
int JudgePrimeNum(int num);
int main()
{

    int num;
    int i=1;
    int flag=0;
    scanf("%d",&num);
    do
    {
        if(JudgePrimeNum(i)==1&&JudgePrimeNum(i+2)==1)
            flag=flag+1;
        i++;     
    } while (i+2<=num);
    printf("%d",flag);
    return 0;
}
//判断数字是否为素数
int JudgePrimeNum(int num)
{
    int flag=1;
    if(num==1){
        flag=0;
    }
    else if(num==2||num==3){
        flag=1;
    }
    else{
        int i;
        for(i=2;i<=sqrt(num);i++)
            if(num%i==0){
                flag=0;
                break;
            }
    }
    return flag;
}

 

6、输出效果:

相关文章
相关标签/搜索