数论问题之水仙花数

水仙花数的定义是:一个三位数,它的每个位上的数字的立方和等于它本身。

例如:

  1. 153 = 1^3 + 5^3 + 3^3
  2. 370 = 3^3 + 7^3 + 0^3
  3. 371 = 3^3 + 7^3 + 1^3
public class NarcissisticNumber {
    public static void main(String[] args) {
        // 输出 100 到 999 之间的所有水仙花数
        printNarcissisticNumbers(100, 999);
    }

    /**
     * 打印指定范围内的所有水仙花数
     * @param start 搜索范围的下限
     * @param end 搜索范围的上限
     */
    public static void printNarcissisticNumbers(int start, int end) {
        // 遍历从 start 到 end 的所有数字
        for (int i = start; i <= end; i++) {
            // 如果 i 是水仙花数,则打印它
            if (isNarcissisticNumber(i)) {
                System.out.println(i + " is a narcissistic number.");
            }
        }
    }

    /**
     * 判断一个数字是否为水仙花数
     * @param num 待判断的数字
     * @return 如果 num 是水仙花数,返回 true;否则返回 false
     */
    private static boolean isNarcissisticNumber(int num) {
        // 获取 num 的位数
        int numDigits = getNumberOfDigits(num);
        // 初始化变量 sum 用于保存每个位上的数字的 numDigits 次幂之和
        int sum = 0;
        // 暂存 num,以免在计算过程中被修改
        int originalNum = num;
        // 遍历 num 的每个位上的数字,并将它们的 numDigits 次幂累加到 sum 中
        while (num > 0) {
            int digit = num % 10;
            sum += Math.pow(digit, numDigits);
            num /= 10;
        }
        // 如果 sum 等于原始的 num,则 num 是水仙花数
        return sum == originalNum;
    }

    /**
     * 获取一个数字的位数
     * @param num 待计算位数的数字
     * @return 数字的位数
     */
    private static int getNumberOfDigits(int num) {
        // 如果 num 为 0,返回 1,否则返回 num 的位数
        return num == 0 ? 1 : (int) Math.log10(num) + 1;
    }
}

这个算法的实现步骤如下:

  1. 在 printNarcissisticNumbers 方法中,遍历从 start 到 end 的所有数字。
  2. 对于每个数字 i,调用 isNarcissisticNumber 方法,判断它是否为水仙花数。
  3. 如果 i 是水仙花数,则打印它。

isNarcissisticNumber 方法的实现步骤如下:

  1. 调用 getNumberOfDigits 方法,获取输入数字 num 的位数。
  2. 初始化一个变量 sum 来保存每个位上的数字的 numDigits 次幂之和。
  3. 暂存 num,以免在计算过程中被修改。
  4. 遍历 num 的每个位上的数字,并将它们的 numDigits 次幂累加到 sum 中。
  5. 如果 sum 等于原始的 num,则 num 是水仙花数,返回 true。
  6. 否则,返回 false。

getNumberOfDigits 方法的实现步骤如下:

  1. 如果输入数字 num 为 0,返回 1。
  2. 否则,返回 num 的位数,通过取 log10(num) 的整数部分加 1 来计算。

通过这个算法,我们可以找到 100 到 999 之间的所有水仙花数。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值