1. 程式人生 > >java——LeetCode(二)

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、待續