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

NYOJ 517 最小公倍數:BigInteger 遞推預處理 1..100 所有 LCM

     編輯:C++ 入門

問題:多測試用例,每次給定 n (≤100),輸出 1..n 的最小公倍數。結果極大,需高精度。

遞推公式

LCM(1..n) = LCM( LCM(1..n-1), n )
即 L[n] = L[n-1] * n / gcd(L[n-1], n)。

Java BigInteger 實現

import java.util.Scanner;
import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigInteger[] lcm = new BigInteger[101];
        lcm[1] = BigInteger.ONE;
        for (int i = 2; i <= 100; i++) {
            BigInteger iBI = BigInteger.valueOf(i);
            lcm[i] = lcm[i-1].multiply(iBI).divide(lcm[i-1].gcd(iBI));
        }
        while (cin.hasNext()) {
            int n = cin.nextInt();
            System.out.println(lcm[n]);
        }
    }
}

關鍵點

  • 預處理 O(100) 一次性算完,查詢 O(1);
  • BigInteger 內置 gcd、multiply、divide,代碼極簡;
  • 結果極大(LCM(1..100) 約 42 位),long 遠遠不夠,必須用高精度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved