填空题 下列给定的程序中,函数fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。
请改正函数fun中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include<stdio.h>
#include<math.h>
void fun(int a,int*b,int*c)
{
int i,j,d,y;
for(i=3;i<=a/2;i=i+2)
{
/**********found**********/
y=0;
for(j=2;j<=sqrt((double)i);j++)
if(i%j==0)
y=0;
if(y==1)
{
/**********found**********/
d=i-a;
for(j=2;j<=sqrt((double)d);j++)
if(d%j==0) y=0;
if(y==1)
{*b=i;*c=d;}
}
}
}
void main()
{
int a,b,c;
do
{
printf("/nInput a:");
scanf("%d",&a);
}while(a%2);
fun(a,&b,&c);
printf("/n/n%d=%d+%d/n",a,b,c);
}
【正确答案】
【答案解析】y=1;
(2)d=a-i; [解析] 这道题是历年的经典考题,也是验证哥德巴赫猜想的变体。原来的思路是:任意一个大于等于6的偶数都可以分解为两个素数之和,n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如果都是,则为一组解;如果n1不是素数,就不必再检查n2是否为素数。先从n1=3开始,检验n1和n2(n2=N-n1)是否为素数;然后使n1+2 再检验n1,n2是否为素数,……直到n1=n/2为止。