Java實現大整數乘法
阿新 • • 發佈:2018-12-22
請設計一個有效的演算法,可以進行兩個n位大整數的乘法運算
1 最暴力的方法:O(n^2)
2 我們採用分而治之的思想
將X和Y按如下方法分成兩部分
那麼
X = A*10^(n/2) + B
Y = C*10^(n/2) + D
X*Y = (A*10^(n/2) + B)*( C*10^(n/2) + D)
= A*C*10^n + A*C*10^(n/2) + B*C*10^(n/2) + B*D
複雜度分析
為了降低時間複雜度,必須減少乘法的次數
上式可改寫為
X*Y = (A*10^(n/2) + B)*( C*10^(n/2) + D)
= A*C*10^n + A*C*10^(n/2) + B*C*10^(n/2) + B*D
= A*C*10^n + ((A+B)(C+D) – A*C – B*D)*10*(n/2) + B*D
或者
= A*C*10^n + ((A-B)(D-C) + A*C + B*D)*10*(n/2) + B*D
複雜度分析
Java程式碼
package PowerNumber; /** * 大整數相乘 * @author Dudu * @date 2018-11-10 */ public class BigDataRide { public static int sign(long a) { return a < 0 ? -1 : 1; } public static long bigdataride(long X,long Y,int n) { X = Math.abs(X); Y = Math.abs(Y); if (n == 1) { return X*Y; } else { long a = X / (10 * (n / 2)); long b = X - a * 10 * (n / 2); long c = Y / (10 * (n / 2)); long d = Y - c * (10 * (n / 2)); long ac = bigdataride(a,c,n/2);//遞迴計算a*c long bd = bigdataride(b,d,n/2);//計算b*d long aJb = a + b; long cJd = c + d; long abcd = bigdataride(aJb,cJd,n/2); return (long) (ac*Math.pow(10,n) + (abcd - ac - bd)*Math.pow(10,n/2) +bd); } } public static void main(String[] args) { // 大整數相乘 long x = 25005520; long y = -3420; String sx = String.valueOf(x); int n = sx.length(); long sig = sign(x)*sign(y); long s = bigdataride(x,y,n); System.out.println(s*sig); } }
輸出的結果為:-126590654618000000