未来可期 2023-03-25 20:11 采纳率: 100%
浏览 44
已结题

C语言完数程序解答(大一)

求解答,大一刚学C语言,学到循环结构,请问下面代码有什么问题(好像问题挺大),编译成功,但运行总是有问题,不能交换两数,即使输出有结果,也会在结果后输出一个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,sum;
    scanf("%d,%d",&m,&n);
    if(m>9999||n>9999) printf("error");
    else {if(m>n){
        n=m;
        m=n;
     }
     for(a=m;a<=n;a++){
         for(b=1,sum=0;b<a;b++){
              if(a%b==0) sum=sum+b; 
             }
        if(sum==a) printf("%d,",a);
       } 
    if(a!=sum) printf("error");
    }
    return 0;
}

  • 写回答

3条回答 默认 最新

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

    在这段代码中,有以下问题:

    1. 在交换m和n的值时,代码写反了,应该是先将m的值保存起来,然后将n的值赋给m,最后将保存的m的值赋给n。正确的代码应该是:
    if (m > n) {
        int temp = m;
        m = n;
        n = temp;
    }
    
    1. 在判断是否输入非法时,应该使用逻辑或(||)而不是逗号(,),否则会将逗号当作两个表达式的分隔符。正确的代码应该是:
    if (m > 9999 || n > 9999) {
        printf("error");
    } else {
        // ...
    }
    
    1. 在判断完数时,循环的范围应该是从1到a的一半(a/2),而不是从1到a-1,这样可以减少循环次数。同时,判断完数的条件应该是sum等于a而不是a不等于sum。正确的代码应该是:
    for (b = 1, sum = 0; b <= a / 2; b++) {
        if (a % b == 0) {
            sum += b;
        }
    }
    if (sum == a) {
        printf("%d,", a);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。