zoukankan      html  css  js  c++  java
  • 寻找素数对

    题目:哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.
    做好了这件实事,就能说明这个猜想是成立的.
    由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.

    输入:输入中是一些偶整数M(5<M<=10000).

    输出:对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数.

    题目大意非常简单明了,我一开始想了一些比较奇怪的思路,后来发现只需要暴力即可。

    解题思路大致如下:因为我们需要求的是两个彼此最接近的素数,这两个素数相加等于输入M;因为要找的是最接近的素数,所以两个数的差要尽量小,因此以20为例,不可能是一个3一个17,因为两个数差距过大。因此我们可以从1到M的中间数开始找,即M/2,从中间往两边分别寻找,便能最快高效的找到答案。

    寻找步骤只需要用一个for循环以及两个变量就可以表示:

    for(int i = n/2,j=n/2 ; i>=1,j<=n;--i,++j)

    此外,我们需要一个判断是否是素数的函数:

    inline int isleap(int n){
        int flag = 1;
        for(int i = 2;i<=sqrt(n)+1;++i){
            if(n%i==0) {
                flag = 0;
                break;
            }
        }
        return flag;
    }

    顺便一提:inline可以让函数运行的更快一些,个人习惯喜欢加一下

    完整代码如下:

    #include<iostream>
    #include<map>
    #include<cmath> 
    using namespace std;
    inline int isleap(int n){
        int flag = 1;
        for(int i = 2;i<=sqrt(n)+1;++i){
            if(n%i==0) {
                flag = 0;
                break;
            }
        }
        return flag;
    }
    
    int main()
    {
        int n;
        while(cin>>n){
            for(int i = n/2,j=n/2 ; i>=1,j<=n;--i,++j){
                if(isleap(i)&&isleap(j)&&i+j==n){
                    printf("%d %d
    ",i,j);
                    break;
                }
            }            
        }
        return 0;
    }

    这题就到这里的哈!如果有什么可以改进或者建议的,可以评论或者私信我!!!

  • 相关阅读:
    connect oralce
    monolog php
    js继承
    前后端交互-一些关于接口设计的思考
    zoom:1;
    H5的新特性及部分API详解
    软文参考
    seo细节
    seo每天要做的事情
    seo(每天要干的哪些事)
  • 原文地址:https://www.cnblogs.com/ssfannnnn/p/14136015.html
Copyright © 2011-2022 走看看