描述
完全数(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; } }
参考引用
- 本系列归档至https://github.com/waylau/nowcoder-exam-oj
- 《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action
- 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):https://item.jd.com/13014179.html