1. 程式人生 > >大整數求和其實很簡單!

大整數求和其實很簡單!

昨天參加了學校的程式設計大賽,最後一題就是單純的大整數求和的實現,由於前面做的比較慢,最後沒有來得及做,還是有點遺憾的。那麼大整數是什麼樣的數?究竟有多大呢?求和又該怎麼樣實現?下面分別介紹這幾點。

何為大整數

百度百科給出的定義如下:
大數在程式設計中表示超過32位二進位制位的數

簡單來說就是超出了計算機的表示範圍的整數。對於這樣的數,計算機沒辦法用基本的int,long型別儲存,自然也無法進行計算,但是如果我們需要計算這樣的數的和,又該如何實現呢?我們接著來看。

實現大整數求和

對於數值型別無法表示的數,我們可以使用字串來儲存這樣一個數字的串。我們可以聯想一下純數學解決兩個數的求和方法,我們通常會寫成豎式的形式,對於這樣的形式,需要兩個步驟:一是簡單的加法運算,二是進位運算,通過這樣的方式可以將問題分解,更容易解決。

豎式計算

同樣對於一個字串,我們可以知道它的長度,也可以採用對應位相加判斷進位的方式來實現大整數的加法。做一些小小的改變,由於我們通常都是從前往後遍歷字串,而豎式計算是從後往前的,所以我們將一個數字串首先逆序儲存到陣列中,最後再逆序輸出就是最後的結果,下面看看具體的實現吧:

public class LargeIntegerSum {
	 public static void largeIntegerSumImp(String numA,String numB){
		int lengthA=numA.length();
 		int lengthB=numB.length();
  		int maxLength=lengthA>lengthB?lengthA:lengthB+1;
		int arrayA[]=new int[maxLength+1];
 		int arrayB[]=new int[maxLength+1];
  		int result[]=new int[maxLength+1];
  
  		//將字串逆序儲存到陣列中
  		int i=0;
  		for(i=0;i<lengthA;i++) {
   			arrayA[i]=numA.charAt(lengthA-i-1)-'0';
 		 }
 		 for(i=0;i<lengthB;i++) {
  			 arrayB[i]=numB.charAt(lengthB-i-1)-'0';
  		}
  
 		 //進行大整數求和
  		for(i=0;i<result.length;i++) {
  		 	int add=result[i]+arrayA[i]+arrayB[i];
  		 	if(add<10) {  //沒有進位
    				result[i]=add;
    				continue;
  			}
   			int remainder=add%10;  //有進位是餘數
   			int quotient=add/10;	//商,其實就是1
  			result[i]=remainder;   
  			if(i!=result.length-1) {   //防止越界
   				result[i+1]=quotient;
  			}
  		}
  
  		//再將陣列逆序得到最終的結果
  		String sum="";
  		int lastIndex=0;  
  		//去除末尾的所有0
  		for(i=maxLength-1;i>=0;i--) {
   			if(result[i]!=0) {
    				lastIndex=i;
    				break;
  			}	
  		}
  		for(i=lastIndex;i>=0;i--) {
   			sum+=result[i];
  		}
  		//輸出結果
  		System.out.print(sum);
 	}
 	
  	public static void main(String[] args) {
  		LargeIntegerSum.largeIntegerSumImp("12445544","556533483");
 	}
}

需要注意的一點就是由於我們是逆序做加法的,所以餘數應該放在下一位,而商(進位標識)應該放在本位。

看完了程式碼再用圖的形式看一下執行過程吧:

大整數求和

好了,大整數求和的基本思想就介紹到這裡,下次見!