高精度运算模板
高进度加法模板
vector<int> add(vector<vector<int>>& metric)
{
int carry = 0;
vector<int> res;
for(int i = 0; i < metric[0].size() || i < metric[1].size() || carry; i ++)
{
if(i < metric[0].size()) carry += metric[0][i];
if(i < metric[1].size()) carry += metric[1][i];
res.push_back(carry % 10);
carry /= 10;
}
return res;
}
高精度减法
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<int> sub(vector<int> a, vector<int> b);
bool cmp(vector<int> a, vector<int> b);
int main(void)
{
string s1, s2;
cin >> s1 >> s2;
vector<int> a, b;
for(int i = s1.size() - 1; i >= 0; i --) a.push_back(s1[i] - '0');
for(int i = s2.size() - 1; i >= 0; i --) b.push_back(s2[i] - '0');
vector<int> c;
if( cmp(a, b) )
c = sub(a, b);
else c = sub(b, a), cout << '-';
for(int i = c.size() - 1; i >= 0; i --) printf("%d", c[i]);
return 0;
}
vector<int> sub(vector<int> a, vector<int> b)
{
int borrow = 0;
vector<int> c;
for(int i = 0; i < a.size(); i ++)
{
borrow = a[i] - borrow;
if(i < b.size()) borrow -= b[i];
c.push_back( (borrow + 10) % 10 );
if(borrow < 0) borrow = 1;
else borrow = 0;
}
while(c.size() > 1 && !c.back()) c.pop_back();
return c;
}
bool cmp(vector<int> a, vector<int> b)
{
if(a.size() != b.size()) return a.size() > b.size();
for(int i = a.size() - 1; i >= 0; i --)
if(a[i] != b[i]) return a[i] > b[i];
return true;
}
高精度乘法模板
vector<int> mul(vector<int> a, int b)
{
if(b == 0) return {0};
int carry = 0;
vector<int> c;
for(int i = 0; i < a.size() || carry; i ++)
{
if(i < a.size()) carry += a[i] * b;
c.push_back(carry % 10);
carry /= 10;
}
return c;
}
高精度除法模板
vector<int> div(vector<int> a, int b, int& remain)
{
vector<int> c;
remain = 0;
for(int i = a.size() - 1; i >= 0; i --)
{
remain = remain * 10 + a[i];
c.push_back(remain / b);
remain %= b;
}
reverse(c.begin(), c.end());
while(c.size() > 1 && !c.back()) c.pop_back();
return c;
}