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

Java 計算水仙花數(納西瑟斯數)演算法實作

     編輯:Java 程式設計入門

什麼是水仙花數?

三位數 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.pow
  • 提前剪枝:最大可能和為 n * 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 方法見上
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved