寻找素数对

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;
}