大數相加 之 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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章