题目描述
所谓哥德巴赫猜想,就是指任何一个大于2的偶数,都可以写成两个素数的和。现在输入一个偶数,要求寻找两个素数,使其和等于该偶数。由于可能有多组素数对满足条件,所以本题要求输出两数差最小的那两个素数。
输入要求
输入一个偶整数M,M大于2。
输出要求
对于每个偶数,输出两个彼此最接近的素数,并且其和等于该偶数。(输出时两个素数小的在前,大的在后)。
输入样例
20
输出样例
7 13
超时写法:(原来我是这么写的)
int gdbh(int n){
int i,j,k=0,zx,min=0;
int a[10000],b[10000],c[10000];
for(i=2;i<n;i--){
if(szs(i)){
for(j=2;j<n;j++){ //嵌套循环找出质数
if(szs(j)){
if(i+j==n&&i<=j){
a[k]=i;
b[k]=j;
c[k]=fabs(i-j); //i-j的绝对值数组找出差最小的结果
k++;
}
}
}
}
}
min=c[0];
for(i=1;i<k;i++){ //遍历找出结果最小的数组
if(c[i]<=min){
min=c[i];
zx=i; //记录最小结果的位置
}
}
printf("%d %d",b[zx],c[zx]);
}
#include<stdio.h>
#include<math.h>
int szs(int x){
int i,k=0;
for(i=2;i<x;i++){
if(x%i==0){
k++;
}
}
if(k!=0) return 0;
else return 1;
}
int gdbh(int n){
int i,j;
int k=0,dd,xd;
for(i=n/2;i>0;i--){ //当数据很大时,会超时
if(szs(i)){ //当结果处于中间时也是差最小
j=n-i; //减少一个循环
if(szs(j)){
if(i+j==n&&i<=j){ //第一个结果就是差最小的结果
printf("%d %d\n",i,j);
return 0;
}
}
}
}
}
int main(){
int n;
scanf("%d",&n);
gdbh(n);
return 0;
}