【附加题1】通过代码实现两个超大的数字相加的结果?

558 阅读2分钟

问题:通过代码实现两个超大的数字相加的结果?

代码如下:

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

function addTwoNum(str1, str2) {
    // 代码写这里
}

console.log(addTwoNum(str1, str2)); // 10119288899864197531

题意分析:

  1. 两个超大数字意味着可能超出Number类型最大长度
  2. 由于数字类型长度限制,故两个超大数字应转换为字符串类型
  3. 数字相加应遵循“加法规则”

下面是我的两个实现方式:

简单说明:carry是保存进位值(1表示进位,0是默认值表示不进位),l1l2分别表示str1str2的字符串长度,maxmin分别是判断str1str2中最大长度值和最小长度值。

方法一:

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('');
}

方法二:


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,非常感谢。