n 位自然數,各位數字的 n 次冪之和等於該數本身。
n=3 稱水仙花數,n=4 稱四葉玫瑰數,n=5 稱五角星數……
public static void printArmstrong(int n) {
if (n <= 0) return;
long start = (long) Math.pow(10, n - 1);
long end = (long) Math.pow(10, n);
if (n == 1) start = 0; // 0-9 皆為 1 位自冪數
// 預計算 0-9 的 n 次冪
int[] pow = new int[10];
for (int i = 0; i < 10; i++) pow[i] = (int) Math.pow(i, n);
for (long num = start; num < end; num++) {
long sum = 0, tmp = num;
while (tmp > 0) {
sum += pow[(int)(tmp % 10)];
tmp /= 10;
}
if (sum == num) System.out.print(num + " ");
}
System.out.println();
}
| n | 名稱 | 自冪數 | 數量 |
|---|---|---|---|
| 1 | 獨身數 | 0,1,2,3,4,5,6,7,8,9 | 10 |
| 2 | 無 | — | 0 |
| 3 | 水仙花數 | 153, 370, 371, 407 | 4 |
| 4 | 四葉玫瑰數 | 1634, 8208, 9474 | 3 |
| 5 | 五角星數 | 54748, 92727, 93084 | 3 |
| 6 | 六合數 | 548834 | 1 |
| 7 | 北斗七星數 | 1741725, 4210818, 9800817, 9926315 | 4 |
| 8 | 八仙數 | 24678050, 24678051, 88593477 | 3 |
| 9 | 九九重陽數 | 146511208, 472335975, 534494836, 912985153 | 4 |
| 10 | 十全十美數 | 4679307774 | 1 |
Math.pow9^10 * 10 ≈ 3.4e10 需 longn * 9^n 若小於 10^(n-1) 直接跳過該 nLongStream.range(start, end).parallel().filter(...)public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("輸入位數 n (1-10): ");
int n = sc.nextInt();
printArmstrong(n);
sc.close();
}