C语言完数代码求改(大一)

大一初学C语言,想写一个若输入范围内没有完数,则输出error,但现在问题是貌似不经过if结构直接有没有完数都在结尾输出error,代码写的有点乱,帮忙看一下(已经改了好多版了),谢谢,麻烦了

完数是指一个整数恰好等于它的因子之和(除自身外),则称这个数为完数。从键盘先后输入两个不大于9999的正整数m和n,若m>n,则交换两数。然后求m~n(m和n均为正整数且m≤n)之间的所有完数。

【输入形式】
先后输入两个正整数m和n,用逗号分隔

【输出形式】

输出所有完数,每两个数之间用逗号分隔。若输入非法,则输出“error”

【样例输入】

1,2000

【样例输出】

6,28,496

【样例说明】

【评分标准】

正确性

#include
int main(){
    int m,n,a,b,c,sum;
    int flag=0;
    scanf("%d,%d",&m,&n);
    if(m>9999||n>9999) printf("error");
    else {if(m>n){
        int temp;
        temp=n;
        n=m;
        m=temp;
     }
     for(a=m;a<=n;a++){
         sum=0;
         c=0;
         for(b=1;bif(a%b==0) sum=sum+b; 
             }
        if(sum==a){
           c=c+1;
           if(flag==0){
               flag=1;
               printf("%d",a);
             }
           else printf(",%d",b);
         }
     }  
    if(c==0) printf("error"); 
    }
    return 0;
}

在你的代码中,输出 error 的语句在 for 循环外部,因此无论是否存在完数,都会输出 error。此外,在输出完数时,你使用变量 b 来输出完数,但是这个变量实际上记录的是因子的值,而非完数本身。因此,你需要进行如下修改:

  1. 将输出 error 的语句移到合适的位置,例如可以放在判断范围是否合法的 if 结构内部。

  2. 在输出完数时,使用变量 a 来代替原来的变量 b。

下面是修改后的代码:

#include <stdio.h>

int main() {
    int m, n, a, b, sum, flag = 0, hasPerfectNumber = 0;
    scanf("%d,%d", &m, &n);
    if (m > 9999 || n > 9999) {
        printf("error");
    } else {
        if (m > n) {
            int temp = n;
            n = m;
            m = temp;
        }
        for (a = m; a <= n; a++) {
            sum = 0;
            for (b = 1; b < a; b++) {
                if (a % b == 0) {
                    sum += b;
                }
            }
            if (sum == a) {
                hasPerfectNumber = 1;
                if (flag == 0) {
                    flag = 1;
                    printf("%d", a);
                } else {
                    printf(",%d", a);
                }
            }
        }
        if (hasPerfectNumber == 0) {
            printf("error");
        }
    }
    return 0;
}

在这个修改后的代码中,首先判断输入的范围是否合法,如果不合法则直接输出 error。在判断完数时,如果存在完数,则将变量 hasPerfectNumber 的值设为 1,表示已经找到完数。在输出完数时,使用变量 a 代替原来的变量 b,同时使用 flag 变量来控制输出逗号的位置。最后,如果不存在完数,则输出 error。

#include<stdio.h>
int main(){
    int m,n,a,b,c,sum;
    int flag=0;
    scanf("%d,%d",&m,&n);
    if(m>9999||n>9999) printf("error");
    else {
        if(m==n){
            sum=0;
            for(b=1;b<m;b++){
                if(m%b==0) sum=sum+b; 
            }
            if(sum==m) printf("%d",m);
            else printf("None");
        }
        else{
            if(m>n){
                int temp;
                temp=n;
                n=m;
                m=temp;
            }
            for(a=m;a<=n;a++){
                sum=0;
                for(b=1;b<a;b++){
                    if(a%b==0) sum=sum+b; 
                }
                if(sum==a){
                    c=c+1;
                    if(flag==0){
                        flag=1;
                        printf("%d",a);
                    }
                    else printf(",%d",a);
                }
            }
            if(c==0) printf("none"); 
        }
    }
    return 0;
}


参考GPT和自己的思路:你的代码中有一个问题:在判断完数时,你只统计了完数的个数,但没有判断是否有完数存在。因此,即使输入的范围内没有完数,也会输出"error"。下面是修正后的代码:

#include <stdio.h>
int main() {
    int m, n, i, j, factor, sum, flag=0;
    scanf("%d,%d", &m, &n);
    if (m > n || m > 9999 || n > 9999 || m < 1) {
        printf("error");
        return 0;
    }
    for (i = m; i <= n; i++) {
        // 求因子和
        sum = 0;
        for (j = 1; j < i; j++) {
            if (i % j == 0) {
                sum += j;
            }
        }
        // 判断是否完数并输出
        if (sum == i) {
            if(flag == 0) {
                printf("%d", i); // 第一个完数不需要输出逗号
                flag = 1;
            } else {
                printf(",%d", i);
            }
        }
    }
    // 若不存在完数,输出"error"
    if (flag == 0) {
        printf("error");
    }
    return 0;
}

改进的地方:

  1. 添加了输入范围的判断,若不合法则输出"error";
  2. 在判断完数时,添加了判断是否存在完数的语句。若没有完数存在,则输出"error";
  3. 输出完数时,添加了标志变量flag来判断是否是第一个完数,从而避免输出多余的逗号。
不知道你这个问题是否已经解决, 如果还没有解决的话:

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