首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

有关问题23-所有不能被两个盈数相加的正整数之和

2012-12-21 
问题23-所有不能被两个盈数相加的正整数之和问题描述如下:“当一个数跟其真因子相加之和相等,那就称之为完

问题23-所有不能被两个盈数相加的正整数之和

问题描述如下:

“当一个数跟其真因子相加之和相等,那就称之为完美数(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

热点排行