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