书上的一道c语言的例题

编写程序,验证任意一个偶数为两个素数之和,并输出这两个素数。

#include <stdio.h>
int isprime(int);
void even(int);
int main()
{
    int a;
    printf("Enter a even numner:");
    scanf("%d",&a);
    if(a % 2 == 0) even(a);
    else printf("The %d isn't even number\n'",a);
}
void even(int x)
{
    int i;
    for(i = 2;i <= x/2;i++)
        if(isprime(i))
            if(isprime(x-i))
            {
                printf("%d = %d+%d\n",x,i,x-i);
                return;
            }
}
int isprime(int a)
{
    int i;
    for(i = 2;i <= a/2;i++)
        if(a % i == 0)
        return 0;
    return 1;
}

以上是书上给出的代码但是我在计算和运行后发现这个代码如果输入0或者2的话会没有任何输出内容,0和2在c中不是偶数吗

0和2是偶数
但是它们没法表达成两个素数的和,因为最小的素数是2

这个猜测只对>2的偶数有效,因此代码这样改:

#include <stdio.h>
int isprime(int);
void even(int);
int main()
{
    int a;
    printf("Enter a even numner:");
    scanf("%d",&a);
    if(a == 0 || a == 2 ) printf("The %d isn't ok\n'",a);
    else if(a % 2 == 0) even(a);
    else printf("The %d isn't even number\n'",a);
}
void even(int x)
{
    int i;
    for(i = 2;i <= x/2;i++)
        if(isprime(i))
            if(isprime(x-i))
            {
                printf("%d = %d+%d\n",x,i,x-i);
                return;
            }
}
int isprime(int a)
{
    int i;
    for(i = 2;i <= a/2;i++)
        if(a % i == 0)
        return 0;
    return 1;
}
 

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7667124
  • 这篇博客你也可以参考下:C语言-编写程序,通过一个函数给主函数中定义的数组输入若干大于或等于0的整数,用负数作为输入结束标志;调用另一个函数输出该数组中的数据。
  • 您还可以看一下 李飞老师的C语言开发之数据结构与算法一课程中的 链表的插入(考虑表头和表尾)小节, 巩固相关知识点
  • 除此之外, 这篇博客: 计算机考研复试之C语言编程题中的 先判断字符是否出现在字符串中,如果未出现,则返回0,如果字符出现一次或多次,则返回字符的个数。 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    这段代码存在两个问题导致无法正确输出任意一个偶数为两个素数之和的结果:

    1. isprime函数存在问题:isprime函数在判断一个数是否为素数时,只判断了从2到a/2的数是否能整除a,但实际上只需要判断从2到sqrt(a)即可。修改isprime函数如下:
    int isprime(int a) {
        if (a < 2)
            return 0;
        int i;
        for (i = 2; i <= sqrt(a); i++) {
            if (a % i == 0)
                return 0;
        }
        return 1;
    }
    
    1. even函数的循环条件存在问题:even函数在寻找两个素数之和等于给定偶数x的过程中,循环条件应为i <= x/2,而不是i <= x/2。修改even函数如下:
    void even(int x) {
        int i;
        for (i = 2; i <= x/2; i++) {
            if (isprime(i)) {
                if (isprime(x-i)) {
                    printf("%d = %d + %d\n", x, i, x-i);
                    return;
                }
            }
        }
    }
    

    修改后的代码如下:

    #include <stdio.h>
    #include <math.h>
    
    int isprime(int);
    void even(int);
    
    int main() {
        int a;
        printf("Enter an even number:");
        scanf("%d", &a);
    
        if (a % 2 == 0)
            even(a);
        else
            printf("The %d is not an even number\n", a);
    }
    
    void even(int x) {
        int i;
        for (i = 2; i <= x/2; i++) {
            if (isprime(i)) {
                if (isprime(x-i)) {
                    printf("%d = %d + %d\n", x, i, x-i);
                    return;
                }
            }
        }
    }
    
    int isprime(int a) {
        if (a < 2)
            return 0;
        int i;
        for (i = 2; i <= sqrt(a); i++) {
            if (a % i == 0)
                return 0;
        }
        return 1;
    }
    

    这样修改之后,该代码能正确输出任意一个偶数为两个素数之和的结果。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^