水仙花數


水仙花數

水仙花數(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++;
        }
    }
}

控制台輸出:

水仙花數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM