java程式計算兩個大整數相乘
阿新 • • 發佈:2018-12-04
方法1 :用兩個字串儲存輸入的大整數,然後用第二個字串的每一位去乘第一個字串的數字值,最後將每次的結果錯位相加即可。時間複雜度高O(n^2)
方法2:將兩個大整數X,Y每次分割成兩半,第一個分割成AB,第二個分割成CD。所以最後結果XY=(A*10^n/2 +B)(C*10^m/2+D);進行分解可得
XY=AC*10^(n+m)/2+AD*10^n/2 +BC*10^m/2 +BD; 注意n/2,m/2為字串後半度的位數。分治法的時間複雜度為O(nlogn);
程式碼如下:兩個方法 放在同名的過載函式中。
package com.test;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int n, m;
String str[] = in.nextLine().split(" ");
String result = multiBigInt(str[0], str[1]);
// 除去首位的0
char[] temp = result.toCharArray();
int i = 0;
for (; i < temp.length; i++) {
if (temp[i] == '0')
continue;
else
break;
}
System.out.println(result.substring(i, result.length()));
String result2 = "";
result2 = multiBigInt(str[0].toCharArray(), str[1].toCharArray());
temp = result2.toCharArray();
i = 0;
for (; i < temp.length; i++) {
if (temp[i] == '0')
continue;
else
break;
}
System.out.println(result2.substring(i, result2.length()));
in.close();
}
//計算單個字元 乘 一個字串
public static String multiBigIntSingle(char[] a, char b) {
int pre = 0;
String result = "";
for (int j = a.length - 1; j >= 0; j--) {
int temp = a[j] - '0';
int tempb = b - '0';
int sum = temp * tempb + pre;
pre = sum / 10;
int left = sum % 10;
result += left;
}
if (pre != 0)
result += pre;
char[] sb = result.toCharArray();
String value = "";
for (int j = sb.length - 1; j >= 0; j--)
value += sb[j];
return value;
}
//方法1
public static String multiBigInt(char[] a, char[] b) {
String c = ""; // 儲存每一行相加後的結果
int j = 0; // 控制錯位
for (int i = b.length - 1; i >= 0; i--) {
c = addBigInt(c.toCharArray(), multiBigIntSingle(a, b[i]).toCharArray(), j++);
}
return c;
}
//方法二
public static String multiBigInt(String a, String b) {
if (a.length() == 1)
return multiBigIntSingle(b.toCharArray(), a.charAt(0));
if (b.length() == 1)
return multiBigIntSingle(a.toCharArray(), b.charAt(0));
int mid1 = a.length() / 2;
int mid2 = b.length() / 2;
String A = a.substring(0, mid1);
String B = a.substring(mid1, a.length());
String C = b.substring(0, mid2);
String D = b.substring(mid2, b.length());
String AC = multiBigInt(A, C);
for (int i = 0; i < a.length() - mid1 + b.length() - mid2; i++) {
AC += '0';
}
String AD = multiBigInt(A, D);
for (int i = 0; i < a.length() - mid1; i++) {
AD += '0';
}
String CB = multiBigInt(C, B);
for (int i = 0; i < b.length() - mid2; i++) {
CB += '0';
}
String BD = multiBigInt(B, D);
String result = addBigInt(AC.toCharArray(), CB.toCharArray(), 0);
result = addBigInt(result.toCharArray(), AD.toCharArray(), 0);
result = addBigInt(result.toCharArray(), BD.toCharArray(), 0);
return result;
}
//將兩個大整數相加 len用於控制錯位相加
public static String addBigInt(char[] a, char[] b, int len) {
int maxlen = a.length + b.length;
char[] revA = reverse(a);
char[] revB = reverse(b);
String sb = "";
int tempa = 0;
int tempb = 0;
int pre = 0;
for (int i = 0; i < maxlen; i++) {
tempa = 0;
tempb = 0;
if (i < revA.length)
tempa = revA[i] - '0';
// 第二行要先以為len的距離 ,錯位相加
if (i < revB.length + len && i >= len)
tempb = revB[i - len] - '0';
int sum = tempa + tempb + pre;
pre = sum / 10;
int left = sum % 10;
sb += left;
}
while (pre != 0) {
sb += pre % 10;
pre /= 10;
}
char[] result = sb.toCharArray();
String value = "";
for (int j = result.length - 1; j >= 0; j--)
value += result[j];
return value;
}
//將一個字元陣列反轉,便於整數相加
public static char[] reverse(char[] a) {
char[] b = new char[a.length];
int i = 0;
int j = a.length - 1;
for (; j >= 0; j--) {
b[i] = a[j];
i++;
}
return b;
}
}
987654321 45
44444444445
44444444445
987654321 987654321
975461057789971041
975461057789971041
7415863 9874563210
73228407950200230
73228407950200230
計算結果用計算機檢驗正確。