题目地址 https://www.acwing.com/problem/content/description/793/
题目描述
给定两个正整数,计算它们的和。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的和。
算法
很明显 输入会超过64位 也就是即使long long 类型也不能进行常规加法
那么输入就是用string 接收字符串 来模拟加法
加法主要是三个数字的相加 数字a 数字b 以及进位
所以 int sum = (a - ‘0‘) + (b - ‘0‘) + next;
然后得到除开进位后本地应该显示的数字 int local = sum % 10;
计算进位 next = sum / 10;
由于加法是从最小位开始的 所以字符串做了逆转
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
还要考虑数字a 和数字b 位数不同的情况
while (i < a.size() && i < b.size()) {
add(a[i], b[i], next);
i++;
}
while (i < a.size()) {
add(a[i], ‘0‘, next);
i++;
}
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 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文地址:https://www.cnblogs.com/itdef/p/10886583.html