题目:
/*
完成一个add方法,完成两个字符串类型的数字相加,并返回这个结果。
注意:这两个数字的值可能会很大,大的会超出javascript所能计算的最大数值。
例:
*/
add("123", "321"); // "444"
add("11", "99"); // "110"
add('987429134712934876249385134781395873198472398562384958739845234859234758913759182357398457398474598237459823745928347538',
'835743829547328954732895474893754893753281957319857432958432548937859483265893274891378593187431583942678439217431924789');// '1823172964260263830982280609675150766951754355882242391698277783797094242179652457248777050585906182180138262963360272327'
我的思路
- 把两个字符串分割成数组,并且数组的每位元素代表一位
- 比较两个数值谁的位数最多,说明这个数值比较大
- 循环,做类似于加法的操作,逢十进一
function add(a, b) {
var number1,number2,MAX_LENGTH,result=[];
//比较两个数值谁的位数多,循环时用
if(a.length>b.length){
number1 = a.split('').reverse()
number2 = b.split('').reverse()
MAX_LENGTH = a.length
}else{
number1 = b.split('').reverse()
number2 = a.split('').reverse()
MAX_LENGTH = b.length
}
// 做加法,因为前面做了数组翻转,所以这个相当于从个位开始计算
for(var i = 0;i<MAX_LENGTH;i++){
var sum
if(number2[i]){
// 两个值在当前位都有值
sum = Number(number1[i])+Number(number2[i])
}else{
// 较小的值在当前位没有值
sum = Number(number1[i])
}
if(result[i]){
// 上个位数计算中逢十进一的判断
sum +=1
}
result[i] = String(sum%10)
if(sum>=10){
// 逢十进一
result[i+1] = '1'
}
}
// 最后结果处理
return result.reverse().join('')
}
厉害的解法
function add (a, b) {
var res = '', c = 0
a = a.split('')
b = b.split('')
while (a.length || b.length || c) {
// 从最后,一位一位两个数字相加
c += ~~a.pop() + ~~b.pop()
// 最后当前这位的值
res = c % 10 + res
// 判端下一位计算时是否需要+1
c = c > 9
}
return res
}
网友评论