大数相加 和 大数相乘

1. 大数相加

image.png

1.1 整数的相加

  function addStrings(strA, strB) {
    if (strA === "0") return strB;
    if (strB === "0") return strA;

    var m = strA.length;
    var n = strB.length;
    var maxLen = Math.max(m, n);

    var list = (new Array(maxLen + 1)).fill(0);

    // 倒序填充 arrA
    var arrA = new Array(maxLen + 1).fill(0);
    for (let i = 0; i < m; i++) {
      arrA[i] = Number(strA[m - i - 1]);
    }

    // 倒序填充 arrB
    var arrB = new Array(maxLen + 1).fill(0);
    for (let i = 0; i < n; i++) {
      arrB[i] = Number(strB[n - i - 1]);
    }

    // 计算结果填充到 list
    for (let i = 0; i < list.length; i++) {
      var t = list[i];
      t += arrA[i];
      t += arrB[i];

      if (t > 9) {
        t = t - 10;
        list[i + 1] = 1;
      }
      list[i] = t;
    }

    // 转为字符串
    var strRet = "";
    let findFirst = false;
    for (let i = list.length - 1; i >= 0; i--) {
      if (findFirst) {
        strRet += list[i].toString();
      } else {
        if (list[i] === 0) {
          continue;
        }
        findFirst = true;
        strRet += list[i].toString();
      }
    }

    return strRet;
  }
  console.log(addStrings("5555", "6666"))

1.2 浮点数相加

将整数部分 和 小数部分 提取出来分别计算,如果新的小数的位数比两者都要大,说明整数部分需要进1,而小数位需要去掉第一位。然后返回二者的拼接。


3. 大数相乘

image.png
//     1     0
//     A     B
//             * 
//     C     D 

//   AC * 100  CB * 10 + AD * 10 +  BD
//  => [0, BD, CB + AD, AC]

function multiple(num1, num2) {
  if (num1 === "0" || num2 === "0") {
    return "0";
  }
  let m = num1.length
  let n = num2.length

  // 最后一位是最高位 相乘结果
  // ansArr[1]是最低位 相乘结果
  // ansArr[0] 如果不为0,那么就是 ansArr[1] 进位
  var ansArr = new Array(m + n).fill(0);

  for(let i = m - 1; i >= 0; i--) {
    for(let j = n - 1; j >= 0; j--) {
      ansArr[i + j + 1] += +(num1[i]) * +(num2[j])
    }
  }

  for(let i = ansArr.length - 1; i > 0; i--) {
    ansArr[i - 1] += parseInt(ansArr[i] / 10);
    ansArr[i] %= 10;
  }

  let result = '';
  let k = ansArr[0] === 0 ? 1 : 0;
  while(k < ansArr.length) {
    result += `${ansArr[k]}`
    k++
  }
  return result
}

// 测试
var res = multiple("33", "55");
console.log(res)

浮点数相乘可以分为两部分分别计算:整数部分 和 小数部分

你可能感兴趣的:(大数相加 和 大数相乘)