描述

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。

例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。

给定函数count(int n),用于计算n以内(含n)完全数的个数。计算范围, 0 < n <= 500000

返回n以内完全数的个数。 异常情况返回-1

输入描述: 输入一个数字

输出描述: 输出完全数的个数

示例1

输入
1000

输出
3

解法

如何求真因子?

约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。

真因子就是把自身排除在外的约数。

例如:28,要求它的真因子,就从尝试除以一个数(这个数从1开始遍历到27),如果没有余数,那这个数就是28的真因子。把这些真因子累加,如果等于28,则这个28是完全数。

 * Copyright (c) waylau.com, 2022. All rights reserved.
 */

package com.waylau.nowcoder.exam.oj.huawei;


import java.util.Scanner;

/**
 * HJ56 完全数计算.
 * 描述:完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
 * 它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
 * 例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
 * 给定函数count(int n),用于计算n以内(含n)完全数的个数。计算范围, 0 < n <= 500000
 * 返回n以内完全数的个数。 异常情况返回-1
 * 输入描述: 输入一个数字
 * 输出描述: 输出完全数的个数
 * 示例1
 * 输入
 * 1000
 * 输出
 * 3
 *
 * @author <a href="">Way Lau</a>
 * @since 2022-08-26
 */
public class HJ056PerfectNumber {
    public static void main(String[] args) {
        // 输入
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();

        // 输出
        System.out.println(countPerfectNumber(n));

        // 关闭
        in.close();
    }

    private static int countPerfectNumber(int n) {
        int count = 0;
        // 从1算到n行为止。
        for (int i = 1; i <= n; i++) {
            // 所有真因子做累加
            int sum = 0;
            for (int j = 1; j < i; j++) {
                // 判断是否是约数
                if (i % j == 0) {
                    sum += j;
                }
            }

            // 是完全数
            if (i == sum) {
                count++;
            }

        }

        return count;
    }
}

参考引用