给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”
示例 2:
输入:num1 = “456”, num2 = "77
" 输出:“533”
示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”
提示:
1 <= num1.length, num2.length <= 104
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零
大数相加问题
因为JavaScript的Number类型是遵循IEEE 754规范表示的,这就意味着JavaScript能精确表示的数字是有限的,JavaScript可以精确到个位的最大整数是9007199254740992,也就是2的53次方,超过这个范围就会精度丢失,造成JavaScript无法判断大小,从而会出现下面的现象
解决方案
思路:将字符串转换为数组,末尾对齐,数组的两两元素相加得到sum,如果sum大于10的话,就往下一位进1,本次计算这一位对10求余数(temp % 10) + res做拼接。最后得到的结果就是精确的
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
var addStrings = function(num1, num2) {
var res = '';
var carry = 0;
var i = num1.length - 1;
var j = num2.length - 1;
while(i >= 0 || j >= 0){
var temp = Number(num1[i]) + Number(num2[j]) + carry;
if(i < 0){
temp = Number(num2[j]) + carry;
i = 0;
}
if(j < 0){
temp = Number(num1[i]) + carry;
j = 0;
}
carry = temp >= 10 ? 1 : 0;
res = (temp % 10) + res;
i--;
j--;
}
return carry > 0 ? `${carry}${res}` : `${res}`;
};
详情可以参考:[https://www.jianshu.com/p/43914015129e/]