如果一个数的所有真因子之和等于这个数,那么这个数被称为完全数。例如,28的所有真因子之和为1 + 2 + 4 + 7 + 14 = 28,所以28是一个完全数。
如果一个数的所有真因子之和小于这个数,称其为不足数,如果大于这个数,称其为过剩数。12是最小的过剩数,1 + 2 + 3 + 4 + 6 = 16。因此最小的能够写成两个过剩数之和的数字是24。经过分析,可以证明所有大于28123的数字都可以被写成两个过剩数之和。但是这个上界并不能被进一步缩小,即使我们知道最大的不能表示为两个过剩数之和的数字要比这个上界小。
找出所有不能表示为两个过剩数之和的正整数之和。
public class Test {
public static boolean isNum(int n) {
int sum = 0;
for (int i = 1; i < n; i++) {
if (n % i == 0) {
sum += i;
}
}
if (sum > n) {
return true;
}
return false;
}
public static void main(String[] args) {
int max = 28123;
long total = 0; // 总计
int count = 0; // 记录过剩数个数
int[] flag = new int[max + 1]; // 标志
int[] n = new int[max]; // 存储所有过剩数
for (int i = 0; i <= max; i++) {
if (isNum(i)) {
n[count] = i;
count++;
}
}
for (int i = 0; i < count; i++) {
for (int j = 0; j < count; j++) {
if (n[i] + n[j] <= max) {
flag[n[i] + n[j]] = 1;
}
}
}
for (int i = 0; i <= max; i++) {
if (flag[i] != 1) {
total += i;
}
}
System.out.println(total);
}
}