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

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

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

  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);
}

参考GPT和自己的思路:这段代码存在以下问题:

  1. 在交换m和n的值时,代码中出现了错误的赋值,应该是 m = n; n = a;
  2. 变量a和sum在循环外部被使用,因此最后的判断条件 if(a!=sum) 会一直成立,导致出现不想要的"error"输出。应该把判断条件移动到第二层循环结束后进行,即 if(a==sum) 。

下面是修改过的代码:

#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){
            int a = m;
            m = n;
            n = a;
        }
        for(a=m;a<=n;a++){
            sum = 0;
            for(b=1;b<a;b++){
                if(a%b==0) sum=sum+b; 
            }
            if(sum==a) printf("%d,",a);
        } 
        if(a-1!=sum) printf("error");
    }
    return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/363964
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:模拟存取款-异常(根据输入的过程,判断账户是否有钱?(要求用异常做) 输入一个整数n,之后n行输入相应的金额,整数为存款,负数为取款,输出最终的余额,若某一过程余额为负,直接抛出异常,并显示余额不足)
  • 除此之外, 这篇博客: C语言编程题中的 17.输入N个元素的整数数组,然后将其前面各元素按照顺序向后移 m个位置,最后m个数变成最前面的m个数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #include<stdio.h>
    #define N 5
    int main() {
    	int a[N], b[N], m;
    	printf("请输入m的值:\n");
    	scanf_s("%d",&m);
    	//1 2 3 4 5 
    	for (int i = 0; i < N; i++) {
    		printf("请输入第%d个元素:\n",i+1);
    		scanf_s("%d", &a[i]);
    	}//m=2 
    	for (int i = 0; i < m; i++) {//4 5
    		b[i] = a[N - m + i];//将要移动的最后元素保存在数组b中
    	}
    	for (int i = N - 1; i >= m; i--) {//1 2 3 4 5 -> 1 2 1 2 3
    		a[i] = a[i - m];//拿到其他元素从后往前一次赋值
    	}
    	for (int i = 0; i < m; i++) {//1 2 1 2 3 -> 4 5 1 2 3 
    		a[i] = b[i];//将保存在数组b中的元素依次赋值到a数组中的前面位置
    	}
    	printf("移动后的数组:\n");
    	for (int i = 0; i < N; i++) {
    		printf("%-3d", a[i]);
    	}
    	return 0;
    }
    

    18.运输公司对用户计算运输费用,距离(s)越长,每公里运费越低。
    每公里每吨货物的基本运费3元,距离不同标准不同,标准如下:

    S<250公里 标准运价的100% 没有折扣

    250<=s<500 公里 标准运价的98% 2%折扣

    500<=s<1000 公里 标准运价的95% 5%折扣

    1000<=s<2000 公里 标准运价的92% 8%折扣

    2000<=s<3000 公里 标准运价的90% 10%折扣

    3000<=s 公里 标准运价的85% 15%折扣

    编写程序根据距离和货物重量计算运费

    #include <stdio.h>
    int main(){
    	float w, sum, z;
    	int x, s;
    	printf("请输入重量:");
    	scanf_s("%f", &w);
    	printf("请输入距离:");
    	scanf_s("%d", &s);
    	if (s >= 3000)
    		x = 12;
    	else
    		x = s / 250;
    	switch (x) {
    		case 0:	  z = 0; break; //代表250km以下,折扣z = 0
    		case 1:   z = 2; break; //代表250~500km以下,折扣z=2%
    		case 2:          break;
    		case 3:   z = 5; break; //代表500~1000km,折扣z=5%
    		case 4:		     break;
    		case 5:          break;
    		case 6:          break;
    		case 7:   z = 8; break; //代表1000~2000km,折扣z=8%
    		case 8:          break;
    		case 9:          break;
    		case 10:         break;
    		case 11:  z = 10; break; //代表2000~3000km,折扣z=10%
    		case 12:  z = 15; break; //代表3000km以上,折扣z=15%
    		default:printf("输入数据错误!\n"); break;
    	}
    	sum = 3 * w * s * (1 - z / 100);
    	printf("总运费是:%f\n", sum);
    	return 0;
    }
    
    

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