intro
完全数
真因子:除本身以外的约数(可为质数,可为合数)。
完全数:6, 28, 496, 8128, 33550336, 8589869056…
code
import java.util.Scanner;
import java.util.List;
import java.util.LinkedList;;
/**
* 编写一个字符界面的JavaApplication程序,
* 接受用户输入的一个整数,并找出这个整数之内的所有完全数。
* 完全数是指等于其所有因子和(包括1但不包括这个数本身)的数。
* 例如6=1×2×3,6=1+2+3,则6是一个完全数。
*/
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个正整数作为数值上限:");
int upper = sc.nextInt();
System.out.printf("以下为区间[2, %s]内的完全数:\n", upper);
for (int i = 2; i < upper; i++) {
if (isPerfectNumber(i)) {
System.out.println(i);
}
}
sc.close();
}
static boolean isPerfectNumber(int number) {
List<Integer> list = getFactorList(number);
int sum = 0; // 和
for (int i = 0, size = list.size(); i < size; i++) {
int factor = list.get(i);
sum += factor;
}
return sum == number;
}
/**
* 获取number的真因子列表(不包括number本身的其他约数)
* @param number
* @return number的因子列表
*/
static List<Integer> getFactorList(int number) {
List<Integer> list = new LinkedList<>();
list.add(1);
double stopPos = Math.sqrt(number) + 0.5;
for (int i = 2; i < stopPos; i++) {
if (canExactDivisor(number, i)) {
list.add(i);
list.add((int) (number / i));
}
}
return list;
}
/**
* 判断数值big是否能被small整除。
* @param big 较大的数
* @param small 较小的数
* @return 布尔值
*/
static boolean canExactDivisor(int big, int small) {
int result = big / small;
return (result * small) == big;
}
}