今天整理一下高精度加法,顺便讲一下原理。
由于数据大小的限制当遇到特别大的两个数相加时,程序会出现问题,内存溢出从而导致无法获得正确结果。因此我们就需要把一个很大数字变成一个string类型的字符串,然后拆开来,拆成单个字符,再一位一位进行计算。(小学加法的方式)
举个简单的栗子:当12+23的时候,我们小学的方式是一位一位加先 2+3=5 ,再 1+2=3
然后两个并起来得到答案35。这个是没有进位的情况。
当有进位的时候:例如36+79。用同样的方法,6+9=15 ,然后15取余得5填入当位,然后1进到下一位并带入计算。下一位计算就是7+3+1得到11,对11取余得1,填入当位。以及加完了但是,还有一个1,那么就在结果前再进一位。得到答案 1 1 5。
注意:计算的时候我们是从最后面(也就是最低位)开始的,所以需要一步逆序
之后我们把以上思路用代码实现,就如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;//定义一个常量
vector<int>add(vector<int>& A, vector<int>& B) {
vector<int>c;//定义动态整形数组c
int t = 0;//t为余项
for (int i = 0; i < A.size() || i < B.size(); i++) {
if (i < A.size()) t += A[i];//如果A数组还有数字就加上
if (i < B.size()) t += B[i];//如果B数组还有数字就加上
c.push_back(t % 10);//取余数
t /= 10;//t整除10,作为进项
}
if (t) c.push_back(1);//如果最后结束了,t还有,就再进1
return c;//返回c数组
}
int main() {
string a, b;//定义a,b为字符串
vector<int> A, B;//定义动态整形数组A,B
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i--) {
A.push_back(a[i] - '0');//将a字符串逆序赋值给A数组(注意这里(a[i]-'0')将数字字母转化为数字(原理为用a[i]的ASCII码值减去0的ASCII码值)
}
for (int i = b.size() - 1; i >= 0; i--) {
B.push_back(b[i] - '0');//操作同上
}
auto C = add(A, B);//进行处理
for (int i = C.size() - 1; i >= 0; i--) cout << C[i];//输出
return 0;
}
下篇预告:高精度乘法。
还恳请各位大佬多指点指点这个蒟蒻牛~