问题描述如下:
“当一个数跟其真因子相加之和相等,那就称之为完美数(profect number)
如果一个数比其真因子相加之和还大,那就称之为亏数(deficient number),如果比真因子相加还小,那就称之为盈数(abundant number)。
12是最小的盈数,1+2+3+4+6=16>12.最小的两个盈数相加的正整数是14,我们可以知道大于28123的正整数都可以被两个盈数相加得到。
求不能被两个盈数相加的正整数之和?”
代码实现如下:
/**
* n的真因子之和
*
* @param n
* @return
*/
private static int sumOfFactors(int n) {
int result = 0;
for (int i = 1; i < n; i++) {
if (n % i == 0) {
result += i;
}
}
return result;
}
/**
* n是否是盈数
*
* @param n
* @return
*/
private static boolean isAbundantNumber(int n) {
return n < sumOfFactors(n);
}
/**
* 28123以下盈数数组
*
* @return
*/
private static List<Integer> getAbundantNumbers() {
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < limit; i++) {
if (isAbundantNumber(i)) {
list.add(i);
}
}
return list;
}
/**
* 不能被两个盈数相加的正整数之和
* @return
*/
private static int sum() {
int sum = 0;
List<Integer> list = getAbundantNumbers();
for (int i = 1; i < limit; i++) {
boolean flag = false;
for (int number : list) {
if (number > i / 2) {
break;
}
int temp = i - number;
if (list.contains(temp)) {
flag = true;
break;
}
}
if (!flag) {
sum += i;
}
System.out.println(i);
}
return sum;
}
private static final int limit = 28123;
可以得到答案:4179871
效率比较差,太困就不想优化了,有空再想,今天练一个就先睡了^_^
请不吝赐教。
@anthor ClumsyBirdZ