若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。
输入格式:
输入在第一行中给出正整数 K(≤10),随后一行给出 K 个待检测的、不超过 104 的正整数。
输出格式:
对每个需要检测的数字,如果它是大美数就在一行中输出 Yes
,否则输出 No
。
输入样例:
3
18 29 40
输出样例:
Yes
No
Yes
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
/**
* @author sihua
* @create 2022-10-02-11:01
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int k = Integer.parseInt(reader.readLine());//循环次数
String nums[] = reader.readLine().split(" ");//所检测的所有数
for (int a = 0; a < k; a++) {
if (isHave(nums[a])) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
static void getFactor(int x, HashSet<Integer> factors) {
for (int i = 1; i <= Math.sqrt(x); i++) {
if (x % i == 0) {
factors.add(i);
factors.add(x / i);
}
}
}
static boolean isHave(String str) {
HashSet<Integer> factors = new HashSet<>();//存储一个数的因数(添加数据不可重复)
int x = Integer.parseInt(str);//目标数的整型
getFactor(x, factors);
ArrayList<Integer> factorss = new ArrayList<>(factors);//HashSet转化为ArrayList.
int size = factorss.size();
if (factors.size() >= 4) {
for (int i = 0; i < size; i++) {
for (int j = i + 1; j < size; j++) {
for (int l = j + 1; l < size; l++) {
for (int m = l + 1; m < size; m++) {
int sum = factorss.get(i) + factorss.get(j) + factorss.get(l) + factorss.get(m);
if (sum % x == 0) {
return true;
}
}
}
}
}
return false;
}
return false;
}
}