AcWing 791. 高精度加法 解題記錄

題目地址 https://www.acwing.com/problem/content/description/793/ios

題目描述
給定兩個正整數,計算它們的和。算法

輸入格式
共兩行,每行包含一個整數。ide

輸出格式
共一行,包含所求的和。spa

算法
很明顯 輸入會超過64位 也就是即便long long 類型也不能進行常規加法
那麼輸入就是用string 接收字符串 來模擬加法3d

加法主要是三個數字的相加 數字a 數字b 以及進位
因此 int sum = (a - '0') + (b - '0') + next;
而後獲得除開進位後本地應該顯示的數字 int local = sum % 10;
計算進位 next = sum / 10;
因爲加法是從最小位開始的 因此字符串作了逆轉code

reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
還要考慮數字a 和數字b 位數不一樣的狀況blog

while (i < a.size() && i < b.size()) {
add(a[i], b[i], next);
i++;
}ip

while (i < a.size()) {
add(a[i], '0', next);
i++;
}ci

while (i < b.size()) {
add('0', b[i], next);
i++;
}
還有一種特殊狀況,最後一位還要進位
也就是最後的和 比最大的數還要多一位1 記得最後判斷下字符串

if (next == 1)
v.push_back(1);
最後顯示記錄結果 記得也要作逆轉

reverse(v.begin(), v.end());
for (int i = 0; i < v.size(); i++)
{
cout << v[i];
}

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <vector>
 5 
 6 
 7 using namespace std;
 8 
 9 string a,b;
10 vector<int> v;
11 
12 void add(int a,int b,int& next)
13 {
14     int sum = (a - '0') + (b - '0') + next;
15     int local = sum % 10;
16     v.push_back(local);
17     next = sum / 10;
18 }
19 
20 int main()
21 {
22     cin >> a >> b;
23 
24     reverse(a.begin(),a.end());
25     reverse(b.begin(), b.end());
26 
27     int i = 0; int next = 0;
28     while (i < a.size() && i < b.size()) {
29         add(a[i],b[i],next);
30         i++;
31     }
32 
33     while (i < a.size()) {
34         add(a[i],'0',next);
35         i++;
36     }
37 
38     while (i < b.size()) {
39         add('0',b[i],next);
40         i++;
41     }
42     if (next == 1)
43         v.push_back(1);
44     reverse(v.begin(), v.end());
45     for (int i = 0; i < v.size(); i++)
46     {
47         cout << v[i];
48     }
49 
50 
51     return 0;
52 
53 }
54 
55 
56 做者:defddr
57 連接:https://www.acwing.com/solution/AcWing/content/2074/
58 來源:AcWing
59 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
View Code
相關文章
相關標籤/搜索