寻找素数对
寻找素数对
Problem Description
哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数. 做好了这件实事,就能说明这个猜想是成立的. 由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.
Input
输入中是一些偶整数M(5<M<=10000).
Output
对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数.
Sample Input
20 30 40
Sample Output
7 13
13 17
17 23 同样是先将素数计算出来存起来,用的时候再拿自己需要的个数,省去重复计算的麻烦从两边往中间挤,遇到差值更小的就记下来他们的位置,最后输出该位置
注意:两个素数可以相等 完整代码:
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
int main(){
int m;
int k;
vector<int> a(1300,0);
int s;
int t;
int j;
a[0]=2;
a[1]=3;
int i=2;
int flag1,flag2;
for(t=4;t<10000;t++){
for(s=2;s<=sqrt(t);s++){
if(t%s==0){
break;
}
}
if(s>sqrt(t)){
a[i]=t;
i++;
}
}
while(cin>>m){
int p,q;
int count;
for(j=0;a[j]<m;j++)
{
if(j==1229)
break;
}
p=0;
q=j-1;
flag1=p;
flag2=q;
count=q-p;
while(p<=q){
if(a[p]+a[q]>m)
{q--;
}
else if(a[p]+a[q]<m)
{
p++; }
else{
if(count>q-p){
count=q-p;
flag1=p;
flag2=q;
};
p++;
q--;
}
}
cout<<a[flag1]<<" "<<a[flag2]<<endl;
}
return 0;
}