Problem Description:
哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.
做好了这件实事,就能说明这个猜想是成立的.
由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.
Input:
输入中是一些偶整数M(5<M<=10000).
Output:
对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数.
Sample Input:
20 30 40
Sample Output:
7 13
13 17
17 23
解题思路:
在judge()函数中打出一张1到10000以内的素数表。prime[i]=1表示数i为素数,反之不是。然后再在main()中从接近输入n/2的数开始渐进寻找即可!
程序代码:
#include<bits/stdc++.h> using namespace std; const int MAXN=10000; int prime[MAXN+1]; void judge()//找出1到10000中间所有的素数 { memset(prime,0,sizeof(prime));//数组清零 int a,flag; for(int i=2;i<=MAXN;i++)//打表 { a=i/2;//一个数不会有大于它自身一半的因子,所以这里可以节省时间 flag=1;//标记变量 for(int j=2;j<=a;j++)//从2到自身的一半 { if(i%j==0)//不是素数 { flag=0; break; } } if(flag) prime[i]=1;//这个数是素数,数组标记为1 } } int main() { judge(); int n,t; while(cin>>n) { t=n/2; while(t>=2) { if(prime[t]&&prime[n-t]) { cout<<t<<" "<<n-t<<endl; break; } t--; } } return 0; }