1. 程式人生 > >java程式計算兩個大整數相乘

java程式計算兩個大整數相乘

方法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

計算結果用計算機檢驗正確。