求完全数(Perfect Number)

本文介绍了一款Java应用程序,该程序通过用户输入的整数上限,找出并打印出该范围内的所有完全数。完全数是一种特殊的数字,其所有真因子(即除了自身外的所有因子)的和等于该数本身。程序使用了因子查找、因子和计算等关键步骤来实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

intro

完全数
真因子:除本身以外的约数(可为质数,可为合数)。
完全数:6, 28, 496, 8128, 33550336, 8589869056…

code

import java.util.Scanner;
import java.util.List;
import java.util.LinkedList;;

/**
 * 编写一个字符界面的JavaApplication程序,
 * 接受用户输入的一个整数,并找出这个整数之内的所有完全数。
 * 完全数是指等于其所有因子和(包括1但不包括这个数本身)的数。
 * 例如6=1×2×3,6=1+2+3,则6是一个完全数。
 */
public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个正整数作为数值上限:");
        int upper = sc.nextInt();
        System.out.printf("以下为区间[2, %s]内的完全数:\n", upper);
        for (int i = 2; i < upper; i++) {
            if (isPerfectNumber(i)) {
                System.out.println(i);
            }
        }
        sc.close();
    }

    static boolean isPerfectNumber(int number) {
        List<Integer> list = getFactorList(number);
        int sum = 0;     // 和
        for (int i = 0, size = list.size(); i < size; i++) {
            int factor = list.get(i);
            sum += factor;
        }
        return sum == number;
    }
    
    /**
     * 获取number的真因子列表(不包括number本身的其他约数)
     * @param number
     * @return number的因子列表
     */
    static List<Integer> getFactorList(int number) {
        List<Integer> list = new LinkedList<>();
        list.add(1);
        double stopPos = Math.sqrt(number) + 0.5;
        for (int i = 2; i < stopPos; i++) {
            if (canExactDivisor(number, i)) {
                list.add(i);
                list.add((int) (number / i));
            }
        }
        return list;
    }
    
    /**
     * 判断数值big是否能被small整除。
     * @param big 较大的数
     * @param small 较小的数
     * @return 布尔值
     */
    static boolean canExactDivisor(int big, int small) {
        int result = big / small;
        return (result * small) == big;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值