【附加題1】經過代碼實現兩個超大的數字相加的結果?

問題:經過代碼實現兩個超大的數字相加的結果?git

代碼以下:github

var str1 = '123456789987654321';
var str2 = '9995832109876543210';

function addTwoNum(str1, str2) {
    // 代碼寫這裏
}

console.log(addTwoNum(str1, str2)); // 10119288899864197531
複製代碼

題意分析:數組

  1. 兩個超大數字意味着可能超出Number類型最大長度
  2. 因爲數字類型長度限制,故兩個超大數字應轉換爲字符串類型
  3. 數字相加應遵循「加法規則」

下面是個人兩個實現方式:ui

簡單說明:carry是保存進位值(1表示進位,0是默認值表示不進位),l1l2分別表示str1str2的字符串長度,maxmin分別是判斷str1str2中最大長度值和最小長度值。spa

方法一:code

function addTwoNum(str1, str2){
	var carry = 0, 
      l1 = str1.length, 
      l2 = str2.length, 
      arr = [];
      // 判斷出str1和str2中最大長度的值
    var max = Math.max(l1, l2);
    // 根據加法規則,按從右向左運算規則
    for (var i = l1 - 1, j = l2 -1, n = max -1 ; n >= 0; n--, i--, j--) {
        // 兩個數相加求和,若是和>=10都進位
        // 若是遍歷項爲undefined都轉化爲0
    	var sum = (+str1[i] || 0) + (+str2[j] || 0) + carry;
        if (sum >= 10) {
        	carry = 1;
            arr.push(sum - 10);
        } else {
        	carry = 0;
            arr.push(sum);
        }
    }
    // 運算完成後,若是進位值>0則添加一位進位值
    if (carry > 0) arr.push(carry);
    // 將數組反轉並輸入結果字符串
    return arr.reverse().join('');
}
複製代碼

方法二:blog

function addTwoNum(str1, str2){
  // 將字符串轉換成數組
  var arr1 = str1.split('').reverse();
  var arr2 = str2.split('').reverse();
  var carry = 0, arr = [];
  // 求字符串最大值和最小值
  var max = Math.max(arr1.length, arr2.length);
  var min = Math.min(arr1.length, arr2.length);
  // 根據最大值進行循環遍歷
  for(var i = 0; i < max; i++){
    // 兩個數相加求和,若是和>=10都進位
    // 若是遍歷項爲undefined都轉化爲0
    var tmp = (+arr1[i] || 0) + (+arr2[i] || 0) + carry;
    if( tmp >= 10){
      carry = 1;
      arr.push(tmp - 10);
    } else {
      carry = 0;
      arr.push(tmp);
    }
  }
  // 運算完成後,若是進位值>0則添加一位進位值
  if (carry > 0) arr.push(carry);
  // 將數組反轉並輸入結果字符串
  return arr.reverse().join('');
}
複製代碼

若是你有更好的實現方式,請給我留言!字符串

交流

更多精彩內容請關注個人github博客,若是你以爲還不錯請給個star,很是感謝。get

相關文章
相關標籤/搜索