題目
給定兩個字符串形式的非負整數 num1
和num2
,計算它們的和。
提示:
- num1 和num2 的長度都小於 5100
- num1 和num2 都只包含數字 0-9
- num1 和num2 都不包含任何前導零
- 不能使用任何內建 BigInteger 庫, 也不能直接將輸入的字符串轉換為整數形式
分析與題解
本題我們只需要對兩個大整數模擬「豎式加法」的過程。從低到高逐位相加,如果當前位和超過 10,則向高位進一位。
具體實現也不復雜,我們定義兩個指針 i
和 j
分別指向num1和num2 的末尾,即最低位,同時定義一個變量add
維護當前是否有進位。
需要考慮add進位,當出現超出兩個num的最大位數的進位時,程序才會正常運行
然后從末尾到開頭逐位相加即可。對於兩個數字位數不同的處理,這里統一在指針當前下標處於負數的時候返回 0,等價於對位數較短的數字進行了補零操作,這樣就可以除去兩個數字位數不同情況的處理,具體可以看下面的代碼。
class Solution {
public:
string addStrings(string num1, string num2) {
int i = num1.size() - 1;
int j = num2.size() - 1;
string ans ="";
int add = 0;
//考慮下標從0開始的情況,所以size-1
//同時考慮所有位數耗盡,但是還存在進位的情況
while(i>=0 || j>=0 || add != 0){
int x = i>=0?num1[i]-'0':0;
int y = j>=0?num2[j]-'0':0;
int result = x + y + add;
//填入的位數再換成char數據類型
ans.push_back('0' + result % 10);
add = result / 10;
i--;
j--;
}
reverse(ans.begin(),ans.end());
return ans;
}
};