java——LeetCode(二)

1、完美数(完全数)
一个自然数的所有真因子的和 = 该自然数 ==> 完全数
例如:6 = 1+2+3
28 = 1+2+4+7+14
最快的判断一个数是不是完美数的办法就是:
在这里插入图片描述

import java.util.Scanner;
/**
 * @ClassName TestDemo15
 * @Description 完全数
 *               一个自然数的所有真因子的和 = 该自然数 ==> 完全数
 *               一个自然数的所有真因子的和 < 该自然数 ==> 亏数
 *               一个自然数的所有真因子的和 > 该自然数 ==> 盈数
 * @Author lzq
 * @Date 2018/12/5 11:50
 * @Version 1.0
 **/
public class TestDemo15 {
    /**
     * 查找给定范围内的完美数个数
     * @param n
     * @return
     */
    public static int count(int n){
        if(n <= 0 || n > 500000) {
            return -1;
        }
        int count = 0;
        for(int i = 2;i <= n;i++){
            if(isPerfect(i)){
                count++;
            }
        }
        return count;
    }

    /**
     * 这是最快的判断方法
     * @param src
     * @return
     */
    private static boolean isPerfect(int src){
        int sum = 1;
        /**
         * 从2开始遍历 只需要遍历前面半部分就可以了,这个判断的
         * 终止条件就是当前分解因子的平方小于等于完美数,因为前面的半部分的最
         * 后一个分解因子和后面部分的第一个分解椅子的区别就是这个
         */
        for(int i =2;i*i<=src;i++){
            if(src%i==0){
                sum += i;
                sum += src/i;
            }
        }

        if(sum==src){
            return true;
        }
        return false;
    }

    public static void main(String [] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int n = in.nextInt();
            System.out.println(count(n));
        }
    }
}

2、待续

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/84845855