大数相加 之 javascript版 据传是个腾讯面试题

前两天看公众号,有腾讯的面试题是远程写个大数相加。早上自己就练手写了一个。

大致思路是用字符串代替数字,倒序后进位相加。暂时不考虑负数的情况。(正负数在判断符号后,可以归纳为异号相减,同号相加,最后处理符号即可)。

为了调试方便没有加函数,直接写在最外层:

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"

猜你喜欢

转载自blog.csdn.net/github_36487770/article/details/80049813
今日推荐