首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 自冪數(水仙花數廣義)計算:任意位數通用演算法與已知結果表

     編輯:Java 程式設計入門

定義

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,910
2無—0
3水仙花數153, 370, 371, 4074
4四葉玫瑰數1634, 8208, 94743
5五角星數54748, 92727, 930843
6六合數5488341
7北斗七星數1741725, 4210818, 9800817, 99263154
8八仙數24678050, 24678051, 885934773
9九九重陽數146511208, 472335975, 534494836, 9129851534
10十全十美數46793077741

效能優化關鍵

  • 預計算冪次表:避免循環中重複 Math.pow
  • 長整型防溢位:n≥10 時 9^10 * 10 ≈ 3.4e10 需 long
  • 提前剪枝:最大可能和 n * 9^n 若小於 10^(n-1) 直接跳過該 n
  • 並行流:LongStream.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();
}

數學延伸

  • 十進制自冪數總數有限(88 個),最大為 39 位數
  • 其他進制同理,二進制只有 0, 1
  • 廣義自冪數:各位冪次不必相同(如 89 = 8¹ + 9²)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved