问题分析:
对于输入的偶数,先求得其一半的值,若不为奇数则减去1,然后从这个奇数开始从大到小用奇数试探。根据哥德巴赫猜想,一个偶数可以分解为两个素数之和,其中一个必然小于或等于这个偶数的一半。
有了上述的一个奇数p,对于输入的m来说,另外一个奇数就是m-p。
只要测试这两个奇数都是素数,就得到了差距最小的两个素数,输出即可。
using namespace std;
#include <iostream>
#include <math.h>
int isprime(int n){
if (n==3)
return 1;
int temp,i;
temp=n%6;
if(temp !=1&&temp!=5)
return 0;
temp=sqrt(n);
for(i=3;i<=temp;i+=2){
if(n%i==0)
return 0;
}
return 1;
}
int main(){
int m,p;
while(cin>>m){
p=m/2;
if(p%2==0)
p--;
for(;;){
if(p<=2)
break;
if(!isprime(p)){
p-=2;
continue;
}
if(isprime(m-p)){
cout<<p<<' '<<m-p<<endl;
break;
}
p-=2;
}
}
return 0;
}