寻找完数

完数: 又称perfect number,若一个数等于出其自身外所有因数(能被其整除的数)的和,则称该数为完数。例如6=1+2+3;28=1+2+4+7+14;从这个定义可知,素数不能是完数。

题目: 输入两个数,例如1,10.找出这两个数中间存在的完数。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package findPerfectNumber;

import java.util.Scanner;

public class findPerfectNumber {

//判断一个数是否为素数
public static boolean isPrimeNumber(int a) {
boolean flag = true;
for(int b=2;b<a;b++) {
if(a%b==0) {
flag = false;
break;
}
}
return flag;
}

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
int a=0;
int sum=1;
for (int i=m;i<n;i++)
{
//System.out.print("i="+i+" ");
if (!isPrimeNumber(i))
{
for(int j=2;j<=i/2;j++)
{
//System.out.print("j="+j+" ");
if(i%j==0)
{
a=i/j;
sum=sum+a;
//System.out.print("sum="+sum+" ");
}
}
if((sum)==i)
{
System.out.println("the result:"+i);
}
}
sum=1;
//System.out.println();
}
}
}

结果输出:

1
100000000
the result:6
the result:28
the result:496
the result:8128
  • 1、这题依然需要调用函数isPrimeNumber,因为若一个数为素数,则显然不可能是完数。所以只需去寻找区间内的非素数即可。
  • 2、但一个数为非素数,则该数肯定存在因数,找出这所有的因数,相加并与该数比较,即可得到结果。
  • 3、寻找因数的方法为,设置一个从i=2开始的循环,当i能被该数整出时,执行sum=sum+i;循环的终止条件为i<=该数/2;