思路
我们只需要普通地模拟数字的加法就可以了。
例子
18 + 34 = 52
第一步
读取数字,将数字用vector存储起来。
第二步
模拟加法的时候我们是从数字尾部开始模拟的,所以为了方便我们可以先将vector反转。
第三步
从初始位置开始相加,也就是4 + 8 = 12。
第四步
当前位置的数字则是12 % 10 = 2。
第五步
进位:12 / 10 = 1。
第六步
指针前移,继续第三步,只不过要再加上上一步的进位。
也就是1 + 1 + 3 = 5。
第七步
由于一开始我们是翻转之后计算的,所以结尾要翻转计算出来的答案,25 -> 52。
完整代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> add(vector<int> v1, vector<int> v2){
vector<int> res;
int cur = 0;//记录进位
for(int i = 0; i < v1.size() || i < v2.size(); i++){
if(i < v1.size()) cur += v1[i];
if(i < v2.size()) cur += v2[i];
res.push_back(cur % 10);//计算当前位置的值
cur /= 10;//计算进位
}
// 看最后有没有进位
if(cur) res.push_back(cur);
// 去掉前缀0
while(res.back() == 0 && res.size() > 1) res.pop_back();
return res;
}
int main(){
string s1, s2;//对应数字用字符串读取
cin >> s1 >> s2;
vector<int> v1, v2;
//将对应字符串存储到vector里面,并且进行翻转。
for(int i = s1.size() - 1; i >= 0; i--) v1.push_back(s1[i] - '0');
for(int i = s2.size() - 1; i >= 0; i--) v2.push_back(s2[i] - '0');
vector<int> ans = add(v1, v2);
//反着输出,等价于翻转
for(int i = ans.size() - 1; i >= 0; i--) {
cout << ans[i];
}
return 0;
}
最后
我们下一篇文章来讲讲高精度减法的具体实现:D
C++实现高精度减法。保姆式教学。