Loading

水仙花数

水仙花数

水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次
幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)

  • 个人实现方式

public class NarcissisticNumber {
    public static void main(String[] args) {
    /**
         * 输出所有的水仙花数
         * 以下代码为个人编写,略微冗余
         */
        // 用于定义循环的数值,单独定义是为了不让代码中出现魔法值(及未经定义的常量)
        int ciculation = 999;
        // 初始化个位的值
        int one = 0;
        // 初始化十位的值
        int ten = 0;
        // 初始化百位的值
        int hundred = 0;

        // 循环执行100-999之间的所有三位数
        for (int i = 100; i <= ciculation; i++) {
            // 整数通过除法运算结果产生小数后,会自动舍弃小数、保留整数部分(不会使用“四舍五入”精确度的计数保留法)
            hundred = i / 100;
            // 根据上面同样的方式计算出十位的数字
            ten = (i - hundred * 100) / 10;
            // 通过减去百位与十位相加的结果得到个位的数字
            one = i - (hundred * 100 + ten * 10);

            // 计算出百位数字的立方结果并赋值
            int hundredCubic = (int)Math.pow(hundred,3);
            // 计算出十位数字的立方结果并赋值
            int tenCubic = (int)Math.pow(ten,3);
            // 计算出个位数字的立方结果并赋值
            int oneCubic = (int)Math.pow(one,3);

            // 将各个位置的数字相加后给结果赋值
            int result = hundredCubic + tenCubic + oneCubic;

            // 如果三位立方相加总和等于其本身,则打印输出该数值
            if (result == i){
                System.out.println(i);
            }

/*            // 各个位数直接相乘三次得到立方值后再相加也可以
            int outcome = hundred * hundred * hundred + ten * ten * ten + one * one * one;
            if (outcome == i) {
                System.out.println(i);
            }*/
        }
    }
}

  • 精简实现方式

public class NarcissisticNumber {
    public static void main(String[] args) {
        // 初始化开始循环的变量值为100
        int num = 100;
        // 定义各位上存放拆解后数值的数组
        int arr[] = new int[3];
        System.out.print("3位的水仙花数有:\t");
        while (num <= 999) {
            // 定义各位上立方数相加总和变量
            int sum = 0;
            // 计算拆解后各位置上相应的数值,并存入数组
            arr[0] = num / 100 % 10;
            arr[1] = num / 10 % 10;
            arr[2] = num % 10;
            // 通过循环及Math.pow()函数得到各数组位置的立方值并相加
            for (int i = 0; i < 3; i++) {
                sum = sum + (int) Math.pow(arr[i], 3);
            }
            // 判断如果立方数总和等于当前数值,则进行打印输入
            if (num == sum) {
                System.out.print(num + "\t");

            }
            num++;
        }
    }
}

控制台输出:

水仙花数

posted @ 2020-07-10 00:27  Schieber  阅读(1445)  评论(0编辑  收藏  举报