java一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子
时间: 2025-06-29 13:12:05 浏览: 9
### Java程序实现完数查找
为了实现在给定范围内查找所有完数的功能,可以按照如下方法构建Java应用程序。该应用接收用户输入的两个整数值作为范围边界,并在此区间内寻找所有的完数及其因子。
#### 完数定义
一个正整数被称为完数,当它等于除自身外的所有正因数之和[^2]。
#### 实现思路
通过遍历指定区间的每一个自然数,对于每个数字执行以下操作:
- 计算当前数字的所有真因子(即能被其整除的小于自身的正整数)
- 判断这些因子相加的结果是否等于原数本身;如果是,则记录下来作为一个完数
- 输出找到的所有完数以及对应的因子列表
下面是具体的代码实现方式:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class PerfectNumberFinder {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入起始值 m:");
int start = scanner.nextInt();
System.out.println("请输入终止值 n:");
int end = scanner.nextInt();
List<Integer> perfectNumbers = findPerfectNumbersInRange(start, end);
if (perfectNumbers.isEmpty()) {
System.out.printf("%d 至 %d 范围内无完数。\n", start, end);
} else {
for (Integer number : perfectNumbers) {
printFactors(number);
}
}
scanner.close();
}
private static boolean isPerfect(int num) {
if (num <= 1) return false; // 排除非正整数
int sumOfDivisors = 0;
for (int i = 1; i * i <= num; ++i) { // 只需迭代至平方根即可优化性能
if (num % i == 0 && i != num) {
sumOfDivisors += i;
// 如果不是完全平方数则加上另一个因子
if ((num / i) != i && (num / i) != num) {
sumOfDivisors += num / i;
}
}
}
return sumOfDivisors == num;
}
private static List<Integer> findPerfectNumbersInRange(int min, int max) {
List<Integer> result = new ArrayList<>();
for (int i = Math.max(min, 1); i <= max; ++i) {
if (isPerfect(i)) {
result.add(i);
}
}
return result;
}
private static void printFactors(int num) {
StringBuilder factorsBuilder = new StringBuilder();
factorsBuilder.append(num).append("=");
for (int factor = 1; factor * factor <= num; ++factor) {
if (num % factor == 0 && factor != num) {
factorsBuilder.append(factor);
if (factor != 1 || num / factor != num) {
factorsBuilder.append("+");
}
if (factor != num / factor && num / factor != num) {
factorsBuilder.append(num / factor);
if (factor * factor < num) {
factorsBuilder.append("+");
}
}
}
}
String formattedOutput = factorsBuilder.toString().replaceAll("\\+$", ""); // 移除最后一个多余的 +
System.out.println(formattedOutput);
}
}
```
此段代码实现了从控制台读取用户输入的起点`start`和终点`end`参数,接着调用辅助函数`findPerfectNumbersInRange()`来获取这两个界限之间所有的完数。最后利用`printFactors()`函数以指定格式展示各个完数与其构成因子的关系。
阅读全文
相关推荐

















