问题:通过代码实现两个超大的数字相加的结果?
代码如下:
var str1 = '123456789987654321';
var str2 = '9995832109876543210';
function addTwoNum(str1, str2) {
// 代码写这里
}
console.log(addTwoNum(str1, str2)); // 10119288899864197531
题意分析:
- 两个超大数字意味着可能超出
Number类型最大长度 - 由于数字类型长度限制,故两个超大数字应转换为字符串类型
- 数字相加应遵循“加法规则”
下面是我的两个实现方式:
简单说明:carry是保存进位值(1表示进位,0是默认值表示不进位),l1和l2分别表示str1和str2的字符串长度,max和min分别是判断str1和str2中最大长度值和最小长度值。
方法一:
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,非常感谢。