4 并非盈数之和

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());
	}

}
  1. 容器类 (line5)
    ArrayList list = new ArrayList<>()
    (1)容器类用来存放不限制数量的记录;
    (2)容器类有两种类型: 容器类型(ArrayList) 、元素类型(Integer)

  2. for循环的限制条件 (line40)
    for(int i=1;i<=num/2;i++) 或 for(;i<=num>>1;) 都表示为整除这个数,取小的商

  3. 可以用 line40-43 简便求因数的和。

  4. 打印数组和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()循环中,每次重新计算。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值