import java.io.IOException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Demo {
// 创建一个方法get判断该数字是否是完数,若是输出该数
//第一种方式使用set集合记录每个约数,相加之后与该数本身比较得出结果
public static void get(int n) {
Set<Integer> set = new HashSet<Integer>();
for (int x = 2; x < Math.sqrt(n); x++) {
if (n % x == 0) {
set.add(x);
set.add(n / x);
}
}
if (set.size() != 0) {
int sum = 0;
for (Integer in : set) {
sum += in;
}
if (sum + 1 == n) {
System.out.print(n + " ");
}
}
}
// 第二种方式,直接定义一个变量sum,将每个约数直接相加赋值给sum,最后将sum与该数本身比较即可
public static void decide(int n,StringBuffer sb){
int sum = 0;
for (int x = 1; x <= n/2; x++) {
if(n % x == 0){
sum += x;
}
}
if(sum == n){
sb.append(n).append(" ");
}
}
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
StringBuffer sb = new StringBuffer();
for (int i = n; i <= m; i++) {
// get(i);
decide(i,sb);
}
String s = sb.substring(0,sb.length()-1);
System.out.println(s);
}
//求1-1000内的完数,运行结果6 28 496
其实求完数并不难,关键是我们没有理解完数的概念。
完数并不是将该数因式分解,将各个因子和1相加等于其本身,
而是将除了自身以外的所有约数相加等于自身。(我之前就在这个位置没理解)
比如28的约数有1、2、4、7、14和28,去除本身28之后,1+2+4+7+14 == 28;
所以28是一个完数 |
|