一个数如果恰好等于它的因子之和, 这个数就称为 “完数 ”。例如 6=1+2+3.编程 找出 1000 以内的所有完数。
时间: 2025-06-28 12:24:13 浏览: 14
### 寻找1000以内所有完数的算法实现
#### C语言中的实现方式
在C语言中,可以通过嵌套循环来查找并打印出1000以内的所有完数及其因子。外层循环遍历每一个可能成为候选者的整数值;内层循环用于计算当前值的所有真因数之和,并判断这个总和是否等于原数值本身。当条件满足时即找到一个完数,并输出其具体信息。
```c
#include <stdio.h>
int main() {
printf("1000 以内的所有完数及其因子:\n");
for (int i = 1; i <= 1000; ++i) {
int sum = 0;
// 计算除自身以外的所有正约数之和
for (int j = 1; j <= i / 2; ++j) {
if (i % j == 0) {
sum += j;
}
}
// 如果这些正约数加起来正好等于原来的数字,则它是一个完美数
if (sum == i && i != 1) {
printf("%d 的因素有 ", i);
// 输出该完美数的因素列表
for (int k = 1; k <= i / 2; ++k) {
if (i % k == 0) {
printf("%d ", k);
}
}
putchar('\n');
}
}
return 0;
}
```
这段代码展示了如何利用双重for循环结构以及简单的模运算操作符`%`来进行筛选工作[^2]。
#### Java语言下的解决方案
对于Java而言,同样可以采用类似的逻辑思路去解决问题。这里给出了一种简洁明了的方法,在主函数内部定义了一个静态方法用来执行主要的任务流程——迭代测试从1到1000之间的各个自然数是不是完数,并最终把符合条件的结果展示出来。
```java
public class PerfectNumbersFinder {
public static void main(String[] args) {
System.out.println("1000以内的所有完数:");
findPerfectNumbers(1, 1000);
}
private static void findPerfectNumbers(int startRange, int endRange) {
boolean foundAny = false;
for (int numToCheck = startRange; numToCheck <= endRange; numToCheck++) {
int divisorSum = getDivisorSum(numToCheck);
if (divisorSum == numToCheck && numToCheck != 1) {
System.out.printf("%d 是一个完数%n", numToCheck);
foundAny = true;
}
}
if (!foundAny) {
System.out.println("未发现任何完数!");
}
}
/**
* 获取给定数字num的所有小于自身的正因数之和.
*/
private static int getDivisorSum(int num) {
int result = 0;
for (int possibleFactor = 1; possibleFactor <= num / 2; possibleFactor++) {
if (num % possibleFactor == 0) {
result += possibleFactor;
}
}
return result;
}
}
```
此版本不仅实现了基本功能,还增加了额外的功能如范围参数化支持、更友好的用户界面设计等特性[^3]。
通过上述两种不同编程语言的具体实例可以看出,尽管语法细节有所差异,但核心思想是一致的:都是基于枚举法的思想逐一遍历指定区间内的每个整数,检查它们是否为完数,并相应地处理输出结果。
阅读全文
相关推荐

















