高精度加法适用于大整数,即科学计数法指数位 len < 10^6,这个长度,在c++中不可以再去用long类型,int类型去存储以及运算。为了满足实际需要,使用数组来存储大整数,并模拟加法的行为创建一个新的功能,这就是高精度加法。
如何存储?
这样的大整数我们用string类型来接受输入,接着把这个大整数存进我们创建的数组里,数组每一个元素对应大整数的每一位,需要注意的是,这里我们是把大整数个位存在数组的第一个元素,大整数的最高位存在数组的末尾。这样做的好处是,涉及进位的时候,我们在末尾新增一个元素,比在起始处新增一个元素的难度简单得多。
```
string A, B;
cin >> A >> B;
vector<int> a, b;
for(int i = A.size() - 1; i >= 0; i --)a.push_back(A[i] - '0');
for(int i = B.size() - 1; i >= 0; i --)b.push_back(B[i] - '0')
```
如何模拟加法行为?
我的理解是可以看作我们小学时做过的竖式题,每个位相加,过十进位。对应到数组操作,数组的对应元素相加,记录进位,并把应该留下的数字插进新的存储结果的数组中。下一对元素相加,再加上进位,重复以上的操作。循环结束后,检查t是否还有一位未进,如果有,再插入1
vector<int> add(vector<int> a, vector<int> b)
{
vector<int> c;
int t = 0;
for(int i = 0; i < a.size() || i < b.size(); i ++)
{
if(i < a.size())t += a[i];
if(i < b.size())t += b[i];
c.push_back(t % 10);
t /= 10;
}
if(t)c.push_back(1);
return c;
}
完整代码
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
vector<int> add(vector<int> a, vector<int> b)
{
vector<int> c;
int t = 0;
for(int i = 0; i < a.size() || i < b.size(); i ++)
{
if(i < a.size())t += a[i];
if(i < b.size())t += b[i];
c.push_back(t % 10);
t /= 10;
}
if(t)c.push_back(1);
return c;
}
int main()
{
string A, B;
cin >> A >> B;
vector<int> a, b;
for(int i = A.size() - 1; i >= 0; i --)a.push_back(A[i] - '0');
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;
}
t
主要用来进位,但履行的功能更加丰富,首先用它来存储位的加和,加和结果个位是结果的位,十位是进到下一位的位的记录。所以取它的模之后去掉它的个位留到下一次循环。- 循环条件是
i
小于拥有位数最多的大整数的位数,进入循环体要再判断一次参与加和的大整数这个位置还有没有数字。
本文做学习笔记用,课程是acwing的算法基础课,笔者大一计算机专业,敬请指正和交流