未优化非负高精度四则运算+输入输出模板(自用)
作者:
あこがれの秋
,
2023-03-18 10:52:00
,
所有人可见
,
阅读 190
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
template <typename T> inline vector<T> operator+(vector<T> a, vector<T> b) // 高精 + 高精
{
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
if (a.size() < b.size())
swap(a, b);
a.emplace_back(0);
for (int i = 0; i < a.size() - 1; a[i + 1] += a[i] / 10, a[i] %= 10, ++i)
if (i < b.size())
a[i] += b[i];
while (a.size() > 1 && !a[a.size() - 1])
a.pop_back();
reverse(a.begin(), a.end());
return a;
}
template <typename T> inline vector<T> operator-(vector<T> a, vector<T> b) // 高精 - 高精
{
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
for (int i = 0; i < a.size(); ++i)
if (i < b.size())
a[i] -= b[i];
for (int i = 0; i < a.size() - 1; ++i)
if (a[i] < 0)
a[i] += 10, a[i + 1]--;
while (a.size() > 1 && !a[a.size() - 1])
a.pop_back();
reverse(a.begin(), a.end());
return a;
}
template <typename T> inline vector<T> operator*(vector<T> a, vector<T> b) // 高精 × 高精
{
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
vector<long long> c(a.size() + b.size());
for (int i = 0; i < a.size(); i++)
for (int j = 0; j < b.size(); j++)
c[i + j] += a[i] * b[j];
for (int i = 0; i < c.size() - 1; i++)
c[i + 1] += c[i] / 10, c[i] %= 10;
while (c.size() > 1 && !c[c.size() - 1])
c.pop_back();
a.clear();
for (int i = c.size() - 1; i >= 0; i--)
a.emplace_back(c[i]);
return a;
}
template <typename T> inline pair<vector<T>, long long> operator/(vector<T> a, const long long &b) // 高精 ÷ 低精
{
vector<T> c;
long long r = 0;
for (int i = 0; i < a.size(); i++)
{
r = (r << 3) + (r << 1) + a[i];
c.emplace_back(r / b);
r %= b;
}
while (c.size() > 1 && !c[0])
c.erase(c.begin());
return {c, r}; // 答案,余数
}
template <typename T> inline istream &operator>>(istream &in, vector<T> &a) // 输入高精
{
static char ch;
in.get(ch);
while (!isdigit(ch))
in.get(ch);
while (isdigit(ch))
a.emplace_back(ch ^ 48), in.get(ch);
return in;
}
template <typename T> inline ostream &operator<<(ostream &out, const vector<T> a) // 输出高精
{
for (int i = 0; i < a.size(); i++)
out.put(a[i] ^ 48);
return out;
}
不卡常就还好()
虽然挺蠢的但是能用()