问题描述如下:
“当一个数跟其真因子相加之和相等,那就称之为完美数(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
分享到:
相关推荐
两个十以内的整数相加
本程序实现了两个无限长的正整数相加减,使用数组实现。
我们经常遇到两多项式相加的情况,在这里,我们就需要用程序来模拟实现把 两个多项式相加到一起。首先,我们会有两个多项式,每个多项式是独立的一行,每个多项式由系数、幂数这样的多个整数对来表示。 如多项式2x20...
# 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 # 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 # 输入示例 # 输入:target = 9 # 输出:[[2,3,4],[4,5]...
(数据结构与算法)两个大整数相加 http://blog.csdn.net/eeeduo/article/details/37877179
实现2个80位左右的大数相加,暂时不支持负数,只支持正整数。
c语言 利用字符数组实现两个大整数的加减法.exe
题目:输入两个正整数m和n,求其最大公约数。 /**提示:在循环中,只要除数不等于0,用较大数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环的较小的数, 如此循环直到较小的数的值为0...
1.5.6. 输入两个整数 n 和 m,从数列 1,2,3.......n 中 随意取几个数 ....... 116 1.5.7. 输入一个表示整数的字符串,把该字符串转换成整数并输出.............. 118 1.5.8. 给出一个数列,找出其中最长的单调...
c代码-9.键盘输入一个三位数的正整数,其个位与百位相加若等于十位上的数字则输出"Yes",否则输出"No"。例如,输入"176",则输出"Yes"。输入"258",则输出"No
超长正整数相加输入两个字符串数字,返回输出结果//逆序逐位相加//当前位的值//当前位产生的进位if (step > 0)//最后一位产生进位cout << A
递增顺序是指:对于两个分解序列N1 ={n1 ,n2 ,…}和N2 ={m1,m2 ,…},若存在i使得n1 =m1 ,…,ni =mi ,但是ni+1 ,则N1 序列必定在N2 序列之前输出。每个式子由小到大相加,式子间用分号隔开,且每输出4个式子后换行...
https://zhidao.baidu.com/question/1832358279168317980.html?fr=iks&word=MATLAB+%B2%FA%C9%FA%BA%CD%CE%AA%C8%B7%B6%A8%CA%FD%B5%C4%CB%E6%BB%FA%CA%FD&ie=gbk 这是产生和为定值的n个随机数的原网址
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。 【程序10】 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次...
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 【程序21】 题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。 【程序22】 ...
丢失的最小正整数leetcode LeetCode leetcode 题目(共 65 题) 1 两数之和 2 两数相加 3 无重复字符的最长子串 4 寻找两个正序数组的中位数 7 整数反转 9 回文数 13 罗马数字转整数 14 最长公共前缀 15 三数之和 16 ...
实验一:线性表的应用算法:构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减链表。 实验二:线性表的应用算法:构造两个按指数递增的有序链表,实现两个一元...
该程序利用双向链表实现大整数加法,理论上说可以无限大。
c语言三位数的三个数字循序颠倒,输入一个三位数,判断第一个是否为0,为0,则错误,否则就把这三位数颠倒数字顺序输出,代码简单型
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完 数。 【程序10】 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次...