用Java中的fo语句r完全数是一些特殊的自然数,它的所有因子(除自已外的约数)的和等于自身。求1—N之间的所有完全数
时间: 2024-10-14 09:18:06 浏览: 25
在Java中,我们可以利用Sieve of Eratosthenes算法来找出1到N范围内的所有完全数。这是一种经典的方法,用于查找素数并可用于寻找完全数。以下是实现这个算法的一个示例:
```java
import java.util.ArrayList;
import java.util.List;
public class PerfectNumbers {
public static void main(String[] args) {
int n = 100; // 或者你想找的上限值,如n = Integer.MAX_VALUE
List<Integer> perfectNumbers = findPerfectNumbers(n);
System.out.println("完美数列表 (1 to " + n + "):");
for (int number : perfectNumbers) {
System.out.println(number);
}
}
public static List<Integer> findPerfectNumbers(int n) {
boolean[] isPrime = new boolean[n + 1];
for (int i = 2; i * i <= n; i++) {
if (!isPrime[i]) {
for (int j = i * i; j <= n; j += i) {
isPrime[j] = true;
}
}
}
List<Integer> perfectNumbersList = new ArrayList<>();
for (int num = 1; num <= n; num++) {
if (isPerfect(num)) {
perfectNumbersList.add(num);
}
}
return perfectNumbersList;
}
public static boolean isPerfect(int num) {
int sum = 1; // 自然数本身也作为因子
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
sum += i;
if (i != num / i) { // 如果不是本身的平方根,则加第二个因子
sum += num / i;
}
}
}
return sum == num && num > 1; // 验证是否真的完全数(排除1)
}
}
```
在这个例子中,我们首先找到小于或等于n的所有质数(通过Sieve of Eratosthenes),然后对于每个找到的质数p,检查其双倍数2p是否也是质数,如果不是,那么2p的因子包括p和2,因此它们的和就是2p。如果这个过程一直持续下去直到找到某个数的因子之和等于它本身,我们就找到了一个完全数。
阅读全文