题目:哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.
做好了这件实事,就能说明这个猜想是成立的.
由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.
输入:输入中是一些偶整数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; }
这题就到这里的哈!如果有什么可以改进或者建议的,可以评论或者私信我!!!