1. 程式人生 > >JS實現大整數加法

JS實現大整數加法

今天看到一哥們提到大數相加, 於是在網上找了一下思路都一樣的,

實現‘字串加法’,即將兩個以字串形式表示的數字相加,得到結果然後返回一個新的字串。例如:輸入‘123’,‘321’,返回‘444’。這樣在進行兩個任意大的整數相加的時候,既不會溢位,也不會損失精度。

程式碼如下:

function sumStrings(a,b) {
 var result = [], count = 0;

  if(a.length < b.length)  b=[a, a=b][0];
  b=Array(a.length-b.length+1).join('0')+b;
   
  var arrA = a.split('');
  var arrB = b.split('');
  for(var j=0; j<a.length; j++) {
	var temp = (Number(arrA.pop()) + Number(arrB.pop())) +count;
	temp>=10?[temp,count]=[temp-10,1]:count=0;
	result.push(temp);
  }
  result.push(count);

  return result.reverse().join('').replace(/^0+/,'');
}

實現分兩步:

1 為輸入中較小的一個數前端補0,使得兩個數一樣長。在那之前為了確定給哪個數補0首先進行了一次比較。

2 將兩個數的最後一位依次pop出,進行相加,並存儲到result陣列中。如果相加的結果大於10,取個位數部分,並使得進位符號count+1。簡單來說就像小學時學加法那樣,按部就班就對了。

最後得到result陣列,還不是我們要的結果,我們需要對它反轉,然後轉換成字串,還有去除最前面的0.

function sumStrings2(a,b){
	var res='', c=0;
	a = a.split('');
	b = b.split('');
	while (a.length || b.length || c){
		c += ~~a.pop() + ~~b.pop();
		res = c % 10 + res;
		c = c>9;
	}
	return res.replace(/^0+/,'');
}

改進的地方在於:

1. 沒有上面提到的第一步,不用補0,不用判斷哪個數大,如此一來清楚了不少。

2. 沒有使用count變數代表進位,直接將相加結果和進位變數記錄在了一個變數c裡,

3. 使用 ~~a 而不是Number(a)來進行格式轉換。