华为OJ平台——完美数

时间:2023-12-12 17:30:44
 import java.util.Scanner;

 /**
*
* 完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
* 它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
* 例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
*
* 给定函数count(int n),用于计算n以内(含n)完全数的个数
* @param n 计算范围, 0 < n <= 500000
* @return n以内完全数的个数, 异常情况返回-1
*
*/
public class PerfectNumber {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in) ;
int n = cin.nextInt() ;
cin.close();
System.out.println(count(n));
} /**
* 统计小于等于n的正整数中有多少个完美数
* @param n
* @return 小于等于n的正整数中完美数的个数
*/
public static int count(int n){
int count = 0 ;
for(int i = 1 ; i <= n ; i++){
if(judgePerfect(i)){
count++ ;
}
}
return count ;
} /**
* 判断数x是否都是完美数
* @param x
* @return 是则返回true,否则返回false
*/
private static boolean judgePerfect(int x) {
//end表示判断的结束值,这样可以提高性能,减少判断的次数
int end = x/2 ;
int sum = 1 ;
for(int i = 2 ; i <= end ; i++){
if(x%i == 0){
if(x/i == end){
sum = sum + end ;
}else{
sum = sum + i + end ;
}
end = x/(i+1) ;
}
}
if(sum == x){
return true ;
}else{
return false;
}
}
}