给定程序MODI1.C中,函数fun的功能是判断整数n是否是“完数”。当一个数的因子之和恰好等于这个数本身时,就称这个数为“完数”。例如:6的因子包括1、2、3,而6=1+2+3,所以6是完数。如果是完数,函数返回值为1,否则函数返回值为0。数组a中存放的是找到的因子,变量k中存放的是因子的个数。 请改正函数fun中指定部位的错误,使它能得出正确的结果 #include <stdio.h> #include <stdlib.h> int fun(int n,int a[],int *k) { int m=0,i,t; t=n; /*************代码开始**********/ /**********found**********/ for(i=0;i<n;i++) if(n%i==0) { a[m]=i; m++; t=t-i; } /**********found**********/ k=&m; /**********found**********/ if(t=0) return 1; else return 0; /***********代码结束************/ } void main() { int n,a[10],flag,i,k; printf("请输入一个整数: "); scanf("%d",&n); flag=fun(n,a,&k); if(flag) { printf("%d是完数,其因子是: ",n); for(i=0;i<k;i++) printf(" %d ",a[i]); printf("\n"); } else printf(" %d 不是完数.\n",n); system("pause"); }
时间: 2023-07-18 11:41:13 浏览: 108
修改后的程序如下:
```c
#include <stdio.h>
#include <stdlib.h>
int fun(int n, int a[], int *k) {
int m = 0, i, t;
t = n;
for (i = 1; i < n; i++) // 从1开始遍历n的因子
if (n % i == 0) {
a[m] = i;
m++;
t = t - i;
}
*k = m;
if (t == 0) {
return 1;
} else {
return 0;
}
}
int main() {
int n, a[10], flag, i, k;
printf("请输入一个整数: ");
scanf("%d", &n);
flag = fun(n, a, &k);
if (flag) {
printf("%d是完数,其因子是: ", n);
for (i = 0; i < k; i++) {
printf("%d ", a[i]);
}
printf("\n");
} else {
printf("%d不是完数.\n", n);
}
system("pause");
return 0;
}
```
修改说明:
1. 在原代码中,循环变量 `i` 从0开始遍历到 `n-1`,但是在后面计算因子和时,没有排除0,会导致出现除0错误。因此,修改为从1开始遍历到 `n-1`。
2. 在原代码中,计算因子个数时,使用了 `k=&m`,这会导致 `k` 指向了 `m` 的地址,而不是将 `k` 的值赋值为 `m`。因此,修改为 `*k=m`。
3. 在原代码中,判断是否为完数的条件是 `if(t=0)`,这是一个赋值语句,应该改为 `if(t==0)`。
修改后的程序能够正确地判断一个数是否为完数,并输出其因子。
阅读全文