大一初学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 来输出完数,但是这个变量实际上记录的是因子的值,而非完数本身。因此,你需要进行如下修改:
将输出 error 的语句移到合适的位置,例如可以放在判断范围是否合法的 if 结构内部。
在输出完数时,使用变量 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;
}
改进的地方:
使用函数输出指定范围内的函数:输入两个正整数 m 和 n(1<=m,n<=1000),
输出 m~n 之 间 的 所 有 完 数 , 完 数 就 是 因 子 和 与 它 本 身 相 等 的 数 。 要 求 定 义 并 调 用 函 数 factorsum(number),它的功能是返回 number 的因子和。例如,factorsum(12)的返回值是 16 (1+2+3+4+6)