寻找100以内的完数(C语言实现)
完数是指一个数等于它的所有真因子(不包括它本身)之和的数,6的真因子是1、2、3,而1+2+3=6,所以6是完数。

(图片来源网络,侵删)
以下是使用C语言查找100以内所有完数的代码:
#include <stdio.h>
int main() {
int num, sum, i;
printf("100以内的完数有:\n");
for (num = 2; num <= 100; num++) {
sum = 1; // 1是所有数的真因子
// 寻找真因子并计算它们的和
for (i = 2; i <= num / 2; i++) {
if (num % i == 0) {
sum += i;
}
}
// 判断是否为完数
if (sum == num) {
printf("%d\n", num);
}
}
return 0;
}
代码说明:
- 我们使用嵌套循环来检查每个数字
- 外层循环遍历2到100的所有数字
- 内层循环检查每个数字的所有真因子(从2到该数的一半)
- 将所有真因子相加,如果和等于原数,则该数是完数
- 最后输出所有找到的完数
输出结果:
运行上述程序将输出:
100以内的完数有:
6
28
优化建议:
如果需要提高效率,可以优化内层循环的上限为sqrt(num),因为如果i是num的因子,那么num/i也是num的因子:
#include <stdio.h>
#include <math.h>
int main() {
int num, sum, i;
printf("100以内的完数有:\n");
for (num = 2; num <= 100; num++) {
sum = 1; // 1是所有数的真因子
// 优化:只需检查到平方根
for (i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
sum += i;
if (i != num / i) { // 避免重复添加平方数
sum += num / i;
}
}
}
// 判断是否为完数
if (sum == num) {
printf("%d\n", num);
}
}
return 0;
}
这个优化版本可以减少不必要的计算,特别是对于较大的数字。

(图片来源网络,侵删)

(图片来源网络,侵删)
