## 1 高精度加法
c++是不自带高精度运算的,这时候我们就要自己模拟高精度运算
思路是
我们用数组保存这个大数字的每一位,因为涉及到进位问题,所以我们让个位先开始存进数组,即 下标为0的数组存的是个位,下标为1存十位,以此类推
这样当最后一个数位涉及到进位时,我们可以很轻松自然的在数组最后一位加一
*请同时看代码同时看下面的思路,不然你可能不知道t是什么,不知道我在描述什么*
本题中的t,是当前两位数字的和,即n1[i]+n2[i],它的范围是0<=t<=18,最大取18是因为两个数字的每位最大取9,9+9=18;
然后将加完的数字的取模之后加进sum数组中,为什么取模,是因为取模后得到的是本位数字,举例8+7=15,本位只需要得到5就可,1是作为进位留在下次更高位中运算
我们以45+86=131举例举例,这样比较直观好理解
第一步
t初始为0 然后t=5+6=11;
接着sum[0]存下1 这个1是由11%10得来的
然后t=t/10 即t=1,这个1是进位
第二步
t初始为1 这个1是上次进位上来的
然后t=t+4+8=13
然后sum[1]=3 这个3是由t%10得来的,即13%10=3
然后t=t/10 即t=1;
此时退出循环
第三步
判断t=1 说明还有进位
那么sum[2]=1;
最终sum数组为{1 3 1}
倒叙输出即为131
这里恰好巧合,个位和百位一样,看似是正序输出,但是最终答案要倒序输出才对,因为个位是保存在sum[0],但是人类数字习惯个位是最后一位
代码中的注释也很详细
```cpp
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
string a,b;//得到要相加的数字字符串
vector <int> n1,n2;//数字n1和数字n2
vector<int>sum;//得到最终的和
//&是引用类型,速度比较快
vector<int> Myadd(vector<int>&n1,vector<int>&n2){
int t=0; //作为本次计算完的数字 /10后t代表进位
for(int i=0;i<n1.size()||i<n2.size();i++){
//这里加if判断是防止两个数组长度不同,短的会有越界问题
if(i<n1.size())t+=n1[i];
if(i<n2.size())t+=n2[i];
sum.push_back(t%10);//取模10是为了只加上个位数,十位数是进位数
t/=10; //若有机会 t=1,若没进位,t=0;
}
if(t)sum.push_back(t); //若最后一位有进位,要加1
return sum;
}
int main(){
cin>>a>>b;
//因为是从各位开始保存数字,所以要用倒序
for(int i=a.size()-1;i>=0;i--)n1.push_back(a[i]-'0');//-'0'是为了让字符变成整形
for(int i=b.size()-1;i>=0;i--)n2.push_back(b[i]-'0');
Myadd(n1,n2);
for(int i=sum.size()-1;i>=0;i--)cout<<sum[i];
}
```