高精度加法
适用于两个正整数相加,且int和long long 存不下的情况下,用代码模拟两个数相加过程,用vector 存值,实质上就是用vector模拟计算过程,达到数字范围远远高于long long 时的加法操作(本文为1e6)
先上代码:
#pragma GCC optimize(2)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#define pm make_pair
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e6 + 50;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
vector<int > A, B;
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);//如果最后一位要进位直接push_back()即可
return c;
}
int main()
{
string a, b;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] ^ 48);
for (int i = b.size() - 1; i >= 0; i --) B.push_back(b[i] ^ 48);
auto c = add(A, B);//逆序存,地位在前,倒着模拟
for (int i = c.size() - 1; i >= 0; i --) cout << c[i];//逆序输出
cout << endl;
return 0;
}
详解:
sting a, b; 两数之大,long long 存不下,固用string暂时存一下,再转移到vector 中,要注意的是,假设存的数是123456789,在vector中的顺序应该为987654321,一个下标对应一位(个十百千万),为什么要这样做,因为好模拟,我们做加法时经常遇到12 + 98 = 110,如果我们按地位到高位存储,就是12 98 然后按照我们的计算规则从后往前模拟,这样模拟完还多了一位,不好弄,如果从前往后模拟,21 89 这样模拟完了之后可以push_back,输出时逆序即可。
关于模拟:
设一个 t 来控制进位,假设该位为8 和 9,8 + 9 = 17,那么 t % 10 代表本来的答案,t / 10 = 1,代表要进位,计算时实质上就是t = t + a[i] + b[i],再对每一位进行操作。