問題:通過程式碼實現兩個超大的數字相加的結果?
程式碼如下:
var str1 = '123456789987654321';
var str2 = '9995832109876543210';
function addTwoNum(str1, str2) {
// 程式碼寫這裡
}console.log(addTwoNum(str1, str2));
// 10119288899864197531複製程式碼
題意分析:
- 兩個超大數字意味著可能超出
Number
型別最大長度 - 由於數字型別長度限制,故兩個超大數字應轉換為字串型別
- 數字相加應遵循“加法規則”
下面是我的兩個實現方式:
簡單說明:carry
是儲存進位值(1表示進位,0是預設值表示不進位),l1
和l2
分別表示str1
和str2
的字串長度,max
和min
分別是判斷str1
和str2
中最大長度值和最小長度值。
方法一:
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('');
}複製程式碼
方法二:
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,非常感謝。