1. 程式人生 > >程式碼實現超過long長度的數字乘法運算[Java程式碼]

程式碼實現超過long長度的數字乘法運算[Java程式碼]

寫完之後百度了一下我哭了,因為這種方法Java官方Api就可以實現,而且使用很方便很強大…… Q:為什麼要寫這個? A:昨天晚上失眠,睡不著忽然想到這個問題,然後思考了一下寫法,今天下午摸魚寫了出來。

注:使用Java的BigInteger類可以實現大數字的處理運算,具體可以參考這篇部落格部落格地址

我的思路是這樣的,一個乘法運算可以分解為多次的加法運算來進行處理,比如:

  • 5 * 3 = 5 + 5 + 5 = 10 + 5 = 15 所以我在程式碼中先使用一個迴圈,迴圈的因子是乘法運算中的兩個數字中的較小的一個(因為這樣可以提升一些效率),然後使這個因子每次都減一,沒減一一次,就把另外一個較大的數字自身與sum相加。

虛擬碼:

乘數0 與乘數1,乘數0  < 乘數1
sum = 0;
while 乘數0 != 0
	乘數0--;
	sum += 乘數1;

當然由於計算的都是超過long大小的數字,所以這些乘數和sum在程式碼中都是通過String來修飾的。 程式碼如下:

	
	public class GetLongNumSum {
	
		private String numString1;
		private String numString2;
		private boolean isNegative = false;
		
		public GetLongNumSum(String numString1,
String numString2) { // TODO Auto-generated constructor stub //判斷資料長度>0 if (numString1 == null || numString2 == null || numString1.length() < 1 || numString2.length() < 1) { System.out.println("傳入的引數有錯誤"); return; } //判斷結果是否是負數,修改字串內容(去掉負號) if (numString1.startsWith
("-")) { isNegative = !isNegative; numString1 = numString1.substring(1, numString1.length()); } if (numString2.startsWith("-")) { isNegative = !isNegative; numString2 = numString2.substring(1, numString2.length()); } //判斷資料是否全為數字, if (!isAllNumber(numString1) || !isAllNumber(numString2)) { System.out.println("傳入的引數有錯誤"); return; } //將字串前面的0去掉 numString1 = deleteBufZero(numString1); numString2 = deleteBufZero(numString2); //資料正常,開始進行運算 this.numString1 = numString1; this.numString2 = numString2; showMulResult(); } //運算的Main方法 private void showMulResult() { String numString1Temp;//儲存比較大的那個乘數 String numString2Temp;//儲存比較小的那個乘數 if (numString1.length() > numString2.length()) { numString1Temp = numString1; numString2Temp = numString2; } else { numString1Temp = numString2; numString2Temp = numString1; } String sum = numString1Temp; //這兒的核心是把乘法進行分解,分解成多次的加法進行運算,比如5*3 = 5 + 5 + 5 = 10 + 5 = 15 System.out.println("開始時間: " + System.currentTimeMillis()); if (numString2Temp.length() == 1 && numString2Temp.charAt(0) == '0') {//一個乘數為0直接結果為0 sum = "0"; } else if (numString2Temp.length() == 1 && numString2Temp.charAt(0) == '1') {//一個乘數為1直接結果為1 sum = numString1Temp; } else { numString2Temp = deleteNumber(numString2Temp);//先進行一次乘數--,避免最終結果多加了一遍的問題 while(!isAllNumber0(numString2Temp)) {//是否為0 numString2Temp = deleteNumber(numString2Temp);//--運算 sum = numberSum(sum, numString1Temp);//求和運算 } } System.out.println("計算結果: " + sum); System.out.println("結束時間: " + System.currentTimeMillis()); } //加法運算 private String numberSum(String buf1, String buf2) { int buf1Length = buf1.length(); int buf2Length = buf2.length(); int tMinLength = Math.min(buf1Length, buf2Length); String Sum = ""; boolean isCarry = false;//上一次的運算是否存在進位 for (int i = 0; i < tMinLength; i++) { char c1 = buf1.charAt(buf1Length - i - 1); char c2 = buf2.charAt(buf2Length - i - 1); int num1 = c1 - '0'; int num2 = c2 - '0'; int isCarryTemp = 0; if (isCarry) {//如果上次存在進位 isCarryTemp = 1; Sum = Sum.substring(1, Sum.length()); } int num3 = (num1 + num2 + isCarryTemp)%10;//個位 if (num1 + num2 + isCarryTemp >= 10) { Sum = "1" + num3 + Sum; isCarry = true; } else { Sum = num3 + Sum; isCarry = false; } } if (buf1Length < buf2Length) { buf2 = buf2.substring(0, buf2Length-buf1Length); } else { buf2 = buf1.substring(0, buf1Length-buf2Length); } if (isCarry) { int buf2LengthTemp = buf2.length(); int i; for (i = 0; i < buf2LengthTemp; i++) { char c = buf2.charAt(buf2LengthTemp - i - 1); int tempNum = c - '0' + 1; if (tempNum > 9) { buf2 = buf2.substring(0, buf2LengthTemp - i - 1) + tempNum%10 + buf2.substring(buf2LengthTemp - i, buf2LengthTemp); } else { buf2 = buf2.substring(0, buf2LengthTemp - i - 1) + tempNum%10 + buf2.substring(buf2LengthTemp - i, buf2LengthTemp); break; } } if (i == buf2LengthTemp) { buf2 = "1" + buf2; } Sum = Sum.substring(1, Sum.length()); } Sum = buf2 + Sum; return Sum; } //將字串數字減1 private String deleteNumber(String buf) { boolean lendNumFlag = false; String bufTemp = buf; int i; for (i = buf.length()-1; i >= 0; i--) { int num = buf.charAt(i) - '0' - 1; buf = buf.substring(0, i) + ((num+10)%10) + buf.substring(i+1, buf.length()); if (num >= 0) { break; } } return buf; } //去掉字串前面的0 private String deleteBufZero(String buf) { for (int i = 0; i < buf.length(); ) { if (buf.length() < 2) { break; } if (buf.charAt(i) == '0') { buf = buf.substring(1, buf.length()); } else { break; } } return buf; } //判斷字串是否全為0 private boolean isAllNumber0(String buf) { for (int i = 0; i < buf.length(); i++) { if (buf.charAt(i) != '0') { return false; } } return true; } //判斷字串是否全為數字 private boolean isAllNumber(String buf) { String reg = "^\\d+$"; return buf.matches(reg); } }