M073

02-程序修改题 软件154 范金瑞 1476浏览

所属年份:2011.3

下列给定的程序中,函数fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。

请改正函数fun中的错误,使它能得出正确的结果。
注意:部分源程序在文件MODI1.C中,不要改动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);
}

【参考答案】

(1)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为止。