未来可期 2023-03-25 21:43 采纳率: 100%
浏览 68
已结题

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<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){
        int temp;
        temp=n;
        n=m;
        m=temp;
     }
     for(a=m;a<=n;a++){
         sum=0;
         c=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",b);
         }
     }  
    if(c==0) printf("error"); 
    }
    return 0;
}

  • 写回答

4条回答 默认 最新

  • 海洋 之心 2022年度博客之星人工智能领域TOP 1 2023-03-25 21:51
    关注

    在你的代码中,输出 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。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月2日
  • 已采纳回答 3月25日
  • 创建了问题 3月25日

悬赏问题

  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?