前两天看公众号,有腾讯的面试题是远程写个大数相加。早上自己就练手写了一个。
大致思路是用字符串代替数字,倒序后进位相加。暂时不考虑负数的情况。(正负数在判断符号后,可以归纳为异号相减,同号相加,最后处理符号即可)。
为了调试方便没有加函数,直接写在最外层:
var a = '011', b = '0023'
function turnToNum (str){
if(typeof str !== 'string') return
return str.split('').reverse().map( (item) => +item)
}
function turnToStr(numarr){
if(!Array.isArray(numarr)) return
return numarr.reverse().join('')
}
function getBit(num){
return (num !== undefined ? num : 0)
}
var arr = turnToNum(a), brr = turnToNum(b)
var maxLength = arr.length > brr.length ? arr.length : brr.length
var rrr = [] // short for result array(forgive my bad interest)
var tempExtra = 0
for(let i = 0; i < maxLength; i++){
var tempSum = getBit(arr[i]) + getBit(brr[i]) + tempExtra
tempExtra = tempSum >= 10 ? 1 : 0
tempSum = tempSum >= 10 ? tempSum - 10 : tempSum
rrr.push(tempSum)
}
var isRight = + turnToStr(rrr) === (+a) + (+b) // 为了验证,其实没必要真的用大数来验证,小数就可以了,只要原理对就ok
后来看到还有’002’+’004’这种情况,额,那就把结果之前的0都去掉即可。加上这个:
//
var validIndex = rrr.length - 1
rrr.some ((num, numindex) => {
if(num !== 0 ){
validIndex = numindex
return true
}
})
rrr = rrr.slice(validIndex)
最后封装一下,要再完善还可以对传入的参数做下预判,确定是大数再相加。
function addBigNumber(a, b){
function turnToNum (str){
if(typeof str !== 'string') return
return str.split('').reverse().map( (item) => +item)
}
function turnToStr(numarr){
if(!Array.isArray(numarr)) return
return numarr.reverse().join('')
}
function getBit(num){
return (num !== undefined ? num : 0)
}
var arr = turnToNum(a), brr = turnToNum(b)
var maxLength = arr.length > brr.length ? arr.length : brr.length
var rrr = [] // short for result array(forgive my bad interest)
var tempExtra = 0
for(let i = 0; i < maxLength; i++){
var tempSum = getBit(arr[i]) + getBit(brr[i]) + tempExtra
tempExtra = tempSum >= 10 ? 1 : 0
tempSum = tempSum >= 10 ? tempSum - 10 : tempSum
rrr.push(tempSum)
}
var validIndex = rrr.length - 1
rrr.some ((num, numindex) => {
if(num !== 0 ){
validIndex = numindex
return true
}
})
return turnToStr(rrr.slice(validIndex))
}
addBigNumber('9324','231322') //"240646"
addBigNumber('000000000000222222','990000000000999000') //"990000000001221222"