問題:經過代碼實現兩個超大的數字相加的結果?git
代碼以下:github
var str1 = '123456789987654321';
var str2 = '9995832109876543210';
function addTwoNum(str1, str2) {
// 代碼寫這裏
}
console.log(addTwoNum(str1, str2)); // 10119288899864197531
複製代碼
題意分析:數組
Number
類型最大長度下面是個人兩個實現方式:ui
簡單說明:carry
是保存進位值(1表示進位,0是默認值表示不進位),l1
和l2
分別表示str1
和str2
的字符串長度,max
和min
分別是判斷str1
和str2
中最大長度值和最小長度值。spa
方法一:code
function addTwoNum(str1, str2){
var carry = 0,
l1 = str1.length,
l2 = str2.length,
arr = [];
// 判斷出str1和str2中最大長度的值
var max = Math.max(l1, l2);
// 根據加法規則,按從右向左運算規則
for (var i = l1 - 1, j = l2 -1, n = max -1 ; n >= 0; n--, i--, j--) {
// 兩個數相加求和,若是和>=10都進位
// 若是遍歷項爲undefined都轉化爲0
var sum = (+str1[i] || 0) + (+str2[j] || 0) + carry;
if (sum >= 10) {
carry = 1;
arr.push(sum - 10);
} else {
carry = 0;
arr.push(sum);
}
}
// 運算完成後,若是進位值>0則添加一位進位值
if (carry > 0) arr.push(carry);
// 將數組反轉並輸入結果字符串
return arr.reverse().join('');
}
複製代碼
方法二:blog
function addTwoNum(str1, str2){
// 將字符串轉換成數組
var arr1 = str1.split('').reverse();
var arr2 = str2.split('').reverse();
var carry = 0, arr = [];
// 求字符串最大值和最小值
var max = Math.max(arr1.length, arr2.length);
var min = Math.min(arr1.length, arr2.length);
// 根據最大值進行循環遍歷
for(var i = 0; i < max; i++){
// 兩個數相加求和,若是和>=10都進位
// 若是遍歷項爲undefined都轉化爲0
var tmp = (+arr1[i] || 0) + (+arr2[i] || 0) + carry;
if( tmp >= 10){
carry = 1;
arr.push(tmp - 10);
} else {
carry = 0;
arr.push(tmp);
}
}
// 運算完成後,若是進位值>0則添加一位進位值
if (carry > 0) arr.push(carry);
// 將數組反轉並輸入結果字符串
return arr.reverse().join('');
}
複製代碼
若是你有更好的實現方式,請給我留言!字符串
更多精彩內容請關注個人github博客,若是你以爲還不錯請給個star,很是感謝。get