4 并非盈数之和
完全数是指真因数之和等于自身的那些数。
例如,28的真因数之和为1 + 2 + 4 + 7 + 14 = 28,因此28是一个完全数。
一个数n被称为亏数,如果它的真因数之和小于n;反之则被称为盈数。
由于12是最小的盈数,它的真因数之和为1 + 2 + 3 + 4 + 6 = 16,
所以最小的能够表示成两个盈数之和的数是24。
通过数学分析可以得出,所有大于28123的数都可以被写成两个盈数的和;
尽管我们知道最大的不能被写成两个盈数的和的数要小于这个值,但这是通过分析所能得到的最好上界。
题目:找出所有不能被写成两个盈数之和的正整数,并求它们的和。
public class NonAbundantSum {
public static int NonAbundantSum() {
int sum =0;
ArrayList<Integer> list = new ArrayList<>(); //list 容器类
//找出[1,28123]之间的所有盈数,存到 list中
for(int i=1;i<=28123;i++) {
if(AbundantSum(i)) {
list.add(i);
}
}
//判断某个数i 能不能写成两个盈数之和
for(int i=1;i<=28123;i++) {
boolean abundant = false;
int k = 0;
int j = list.size() - 1;
while(k <= j) {
int value = list.get(k) + list.get(j);
if(i > value) {
k++;
}
else if(i< value) {
j--;
}
else {
abundant = true;
break;
}
}
if(!abundant)
sum = sum + i;
}
return sum;
}
public static boolean AbundantSum(int num) {
int sum = 0; //因数的和(不包括数本身num)
//求所有因数的和
for(int i=1;i<=num/2;i++) {
//或 for(;i<=num>>1;)
if(num % i ==0) {
sum = sum + i;
}
}
//判断是否是盈数(sum>num 则是盈数)
return sum > num;
}
public static void main(String[] args) {
System.out.println(NonAbundantSum());
}
}
-
容器类 (line5)
ArrayList list = new ArrayList<>()
(1)容器类用来存放不限制数量的记录;
(2)容器类有两种类型: 容器类型(ArrayList) 、元素类型(Integer) -
for循环的限制条件 (line40)
for(int i=1;i<=num/2;i++) 或 for(;i<=num>>1;) 都表示为整除这个数,取小的商 -
可以用 line40-43 简便求因数的和。
-
打印数组和List集合中的所有元素
(1)打印数组中的所有元素
> String [] array = new String[] {"a", "b", "c"};
> System.out.println(Arrays.toString(array));
(2)打印List集合中的所有元素
> List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(Arrays.toString(list.toArray()));
int i 和 int j ,flag(abundant) --line 14 -16
需要定义在for()循环中,每次都要重置下标和flag.
int value = list.get(k) + list.get(j);
也需要定义在while()循环中,每次重新计算。