完数是指一个整数怡好等于它的因子之和《除自身外,,则称这个数力完数。从键盘先后論入两个不大于9990的正整数n和n,若n2n,则交换两發。然后水m-n(on和 红力正整数且m≤几) 之间的所有完数。 (输人形式】 先后揄入两个正整数n和么,用逗号分隔 【输出形式】 输出所有完数,每两个数之问用画号分隔。若输入非法,则输出 “error”c语言
时间: 2023-05-30 15:06:01 浏览: 202
Perfect-Numbers:确定一个正整数是否是一个完美数
5星 · 资源好评率100%
实现:
```c
#include <stdio.h>
#include <stdbool.h>
bool isPerfect(int n) {
int sum = 1;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
sum += i;
if (i != n / i) {
sum += n / i;
}
}
}
if (sum == n && n != 1) {
return true;
} else {
return false;
}
}
int main() {
int n, m;
if (scanf("%d,%d", &n, &m) != 2 || n > m || n < 1 || m > 9990) {
printf("error");
return 0;
}
if (n > m) {
int t = n;
n = m;
m = t;
}
bool first = true;
for (int i = n; i <= m; i++) {
if (isPerfect(i)) {
if (first) {
first = false;
} else {
printf(",");
}
printf("%d", i);
}
}
return 0;
}
```
思路解析:
题目要求输出在 $n$ 到 $m$ 之间的所有完数,因此需要遍历每个数,判断是否是完数。判断完数的方法是分解质因数,然后求出因子之和,如果等于这个数本身,则是完数。
由于输入格式为两个数字用逗号分隔,因此可以使用 `scanf("%d,%d", &n, &m)` 来读入输入。同时,需要判断输入是否合法,即 $n$ 和 $m$ 是否为正整数且不大于 $9990$,且 $n \leq m$。
判断完数的函数 `isPerfect`,首先初始化因子之和为 $1$,因为 $1$ 也是 $n$ 的因子。然后从 $2$ 开始遍历到 $\sqrt{n}$,如果 $i$ 是 $n$ 的因子,则将 $i$ 加入因子之和。同时,如果 $i$ 不等于 $n/i$,则将 $n/i$ 也加入因子之和。最后判断因子之和是否等于 $n$,如果等于且 $n$ 不等于 $1$,则是完数。
遍历完数的区间 $[n, m]$,如果是完数,则输出这个数,如果不是,则继续遍历。为了便于输出,需要记录是否是第一个完数,如果是第一个,则输出不带逗号的完数,否则在完数前面加上逗号。
阅读全文