三位數 abc 滿足 a³ + b³ + c³ = abc。如 153 = 1³ + 5³ + 3³。
廣義上稱「自冪數」:n 位數各位 n 次冪之和等於自身。
static void getNums(int n, int m) { // 區間 [m, n]
for (int i = m; i <= n; i++) {
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100;
double sum = Math.pow(bai, 3) + Math.pow(shi, 3) + Math.pow(ge, 3);
if (i == sum) System.out.println(i);
}
}
public static void printArmstrong(int digits) {
int start = (int) Math.pow(10, digits - 1);
int end = (int) Math.pow(10, digits);
for (int num = start; num < end; num++) {
int tmp = num, sum = 0;
while (tmp > 0) {
int d = tmp % 10;
sum += Math.pow(d, digits);
tmp /= 10;
}
if (sum == num) System.out.print(num + " ");
}
}
| 位數 n | 名稱 | 自冪數 |
|---|---|---|
| 1 | 獨身數 | 0~9 |
| 2 | 無 | — |
| 3 | 水仙花數 | 153, 370, 371, 407 |
| 4 | 玫瑰花數 | 1634, 8208, 9474 |
| 5 | 五角星數 | 54748, 92727, 93084 |
| 6 | 六合數 | 548834 |
int[] pow = new int[10]; for(i=0;i<10;i++) pow[i] = (int)Math.pow(i, n); 避免重複 Math.pown * 9^n,若小於 10^(n-1) 直接跳過該位數IntStream.range(m, n+1).parallel().filter(...)import java.util.Scanner;
public class ArmstrongNumber {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("請輸入位數 n (1-6): ");
int n = sc.nextInt();
printArmstrong(n);
sc.close();
}
// printArmstrong 方法見上
}