1. 程式人生 > >Java實現大整數乘法

Java實現大整數乘法

請設計一個有效的演算法,可以進行兩個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