超全面超简短的高精加 / 乘模板!!已经封装好了。
$\texttt{Update on 2023/2/11 :}$ 加入了大数乘小数模板。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
struct BigNum:vector<int> { // 数值部分
BigNum(int n = 0) { push_back(n); Carry(); }
BigNum(int SIZE, int _val) { assign(SIZE, _val); }
BigNum &Carry() { // 进位
while (!empty() && !back()) pop_back();
if (empty()) return *this;
for (int i = 1; i < size(); i ++ )
(*this)[i] += (*this)[i - 1] / 10,
(*this)[i - 1] %= 10;
while (back() >= 10) emplace_back(back() / 10), (*this)[size() - 2] %= 10;
return *this;
}
};
int Int_Size(int x) { if (x == 0) return 1; int cnt = 0; while (x) cnt ++ , x /= 10; return cnt; }
istream &operator >> (istream &s, BigNum &n) { // 输入 BigNum
string S; s >> S; n.clear();
for (auto i : S) n.emplace_back(i ^ 48);
reverse(n.begin(), n.end()); return s;
}
ostream &operator << (ostream &s, const BigNum &n) {
if (n.empty()) s << 0;
for (int i = n.size() - 1; i >= 0; i -- )
s << n[i];
return s;
}
BigNum operator * (const BigNum &a, const BigNum &b) {
BigNum ans(a.size() + b.size(), 0);
for (int i = 0; i < a.size(); i ++ )
for (int j = 0; j < b.size(); j ++ )
ans[i + j] += a[i] * b[j];
return ans.Carry();
}
BigNum operator + (const BigNum &a, const BigNum &b) {
BigNum ans(max(a.size(), b.size()) + 1, 0);
for (int i = 0; i < a.size(); i ++ ) ans[i] += a[i];
for (int i = 0; i < b.size(); i ++ ) ans[i] += b[i];
return ans.Carry();
}
BigNum operator * (const BigNum &a, const int &b) {
BigNum ans(a.size() + Int_Size(b) + 1, 0);
for (int i = 0; i < a.size(); i ++ )
ans[i] += a[i] * b;
return ans.Carry();
}
int main() {
BigNum a; int b;
cin >> a >> b;
cout << a * b;
return 0;
}
如果赞大于10个可能会把FFT也写进去。
后期会将符号整数和减法除法加入。
抱走了~
常数怎么样
常数还好,比指针写的快一些。