没写出来代码,只大致说了下思路,Number.MAX_SAFE_INTEGER
最大值是16位,那么将字符串以15位分割,再分别相加,有进位的话就处理进位,最后再将相加后的字符串拼接。
今天翻到学习算法时记的笔记发现学过,但是忘了,还是学得不够深入。
基础版完整思路:模拟竖式运算,使用数组将字符串中的每个数存起来,再依次相加,如果有进位,将进位数加到下一位中
代码如下:
function add (a, b) {
var length = a.length > b.length ? (a.length + 1) : (b.length + 1)
var arrA = []
var arrB = []
var arrR = []
for (var i = 0; i < length; i++) {
arrA[i] = a[a.length - 1 - i] == undefined ? 0 : a[a.length - 1 - i]
arrB[i] = b[b.length - 1 - i] == undefined ? 0 : b[b.length - 1 - i]
arrR[i] = 0
}
console.log(arrA)
for (var i = 0; i < length; i++) {
var sum = Number(arrA[i]) + Number(arrB[i]) + arrR[i]
if (sum > 9) {
arrR[i] = sum - 10
arrR[i + 1] = 1
} else {
arrR[i] = sum
}
}
console.log(arrR)
if (arrR[arrR.length -1] === 0) {
arrR.pop(arrR[arrR.length -1])
}
return arrR.reverse().join('')
}
console.log(add('426709752318', '95481253129'))
优化思路:每15位数(Number.MAX_SAFE_INTEGER
是一个16位数)放入数组的一个元素中
function addBigNumber (a, b, num) {
// 多少位为一组划分后进行相加操作
// 默认是最大安全数字长度减1
var num = num || Number.MAX_SAFE_INTEGER - 1
// 根据num计算进位临界值(例如:999)
var num2 = num
var range = ''
while (num2 > 0) {
range += '9'
num2--
}
var rangeNum = Number(range)
// 根据较长字符串计算出数组长度
var length = Math.ceil((a.length > b.length ? (a.length + 1) : (b.length + 1)) / num)
var arrA = []
var arrB = []
var arrR = []
for (var i = 0; i < length; i++) {
// slice方法传入负数,实现从后往前以num为跨度划分
if (i === 0) {
arrA[i] = a.slice(-num*(i+1)) == '' ? 0 : a.slice(-num*(i+1))
arrB[i] = b.slice(-num*(i+1)) == '' ? 0 : b.slice(-num*(i+1))
arrR[i] = 0
continue
}
arrA[i] = a.slice(-num*(i+1), -num*i) == '' ? 0 : a.slice(-num*(i+1), -num*i)
arrB[i] = b.slice(-num*(i+1), -num*i) == '' ? 0 : b.slice(-num*(i+1), -num*i)
arrR[i] = 0
}
console.log(arrA)
console.log(arrB)
// 每个小单元相加
for (var i = 0; i < length; i++) {
var sum = Number(arrA[i]) + Number(arrB[i]) + arrR[i]
// 处理进位
if (sum > rangeNum) {
arrR[i] = sum - (rangeNum + 1)
arrR[i + 1] = 1
// 与进位临界值相减后的数值需要在前面加0
// 例如arrR[i]此时为5,需要加0变成'005'
if (String(arrR[i]).length < num) {
let num3 = num - String(arrR[i]).length
let add0 = ''
while (num3 > 0) {
add0 += '0'
num3--
}
arrR[i] = add0 + arrR[i]
}
} else {
arrR[i] = sum
}
}
console.log(arrR)
if (arrR[arrR.length -1] === 0) {
arrR.pop(arrR[arrR.length -1])
}
return arrR.reverse().join('')
}
// 测试用,以3位数为一组
console.log(addBigNumber('426709752318', '95481253129', 3))
console.log(addBigNumber('999999999999', '99999999999', 3))
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。