高精度加法
題目描述
給定兩個正整數,計算它們的和
共兩行,每行包含一個整數
輸出一行,包含所求的和
數據長度
問題分析
本題數據量龐大,數據長度有100W
的長度,因此得將數使用字符串來存,將數字拆開後倒序存儲,這樣有效解決進位而要改變數組長度的問題,因此這樣處理方法簡單
將兩個數進行逐位相加,判斷進位則採用一個標識t
來判斷,所加和爲
代碼實現
#include<bits/stdc++.h>
using namespace std;
vector<int> add(vector<int> &A, vector<int> &B){
// 定義新的容器用來存儲 A + B
vector<int> C;
// 定義進位,初始爲 0;
int t = 0;
// 循環累加 A 與 B 的各個位的數
for(int i = 0; i < A.size() || i < B.size(); i++ )
{
// 分別判斷 A 與 B 是否還有數
if(i < A.size()) t += A[i];
if(i < B.size()) t += B[i];
// 將其個位數添加
C.push_back(t % 10);
// 判斷 t 是否進位,若進位則修改爲 1
t /= 10;
}
// 判斷最後是否進位
if(t) C.push_back(1);
return C;
}
int main(){
string a, b;
vector<int> A, B, C;
cin >> a >> b;
// 倒序逐個拆分數字放入 <vector> 中
for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
for(int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');
C = add(A, B);
// 倒置輸出,因爲裝入時倒序裝入
for(int i = C.size() - 1; i >= 0; i--) printf("%d" ,C[i]);
return 0;
}
運行結果
輸入
154540
2544111
輸出
2698651
總結
對於大整數用字符串進行存放,拆分後的每一個數字用
vector
存放,從後開始往前存解決進位數字長度變化問題循環次數取決於兩個數的長度
每次動態通過
t /= 10
判斷是否有進位