寻找素数对

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

输入:输入中是一些偶整数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;
}

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

原文地址:https://www.cnblogs.com/ssfannnnn/p/14136015.html