前兩天看公衆號,有騰訊的面試題是遠程寫個大數相加。早上自己就練手寫了一個。
大致思路是用字符串代替數字,倒序後進位相加。暫時不考慮負數的情況。(正負數在判斷符號後,可以歸納爲異號相減,同號相加,最後處理符號即可)。
爲了調試方便沒有加函數,直接寫在最外層:
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"