rt,减法在答案是负数的情况会出错,除法没输出(,,,
QwQ
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e4 + 5;
struct BigInt
{
int len, x[N];
BigInt()
{
memset(x, 0, sizeof x);
len = 0;
}
BigInt(string s)
{
memset(x, 0, sizeof x);
len = s.size();
for (int i = 0; i < len; i++)
{
x[i + 1] = s[len - i - 1] - '0';
}
}
};
ostream& operator << (ostream& os, BigInt s) // 输出
{
for (int i = s.len; i >= 1; i--)
{
os << s.x[i];
}
return os;
}
istream& operator >> (istream& is, BigInt& p) // 输入
{
string s;
cin >> s;
p = BigInt(s);
return is;
}
BigInt fix(BigInt p) // fix
{
for (int i = 1; i < p.len; i++)
{
p.x[i + 1] += p.x[i] / 10;
p.x[i] %= 10;
if (p.x[i] < 0)
{
p.x[i] += 10;
p.x[i + 1]--;
}
}
while (p.x[p.len] > 9)
{
p.x[p.len + 1] += p.x[p.len] / 10;
p.x[p.len] %= 10;
p.len++;
}
while (p.x[p.len] == 0 && p.len > 1)
{
p.len--;
}
return p;
}
BigInt operator + (BigInt p, int m) // 大 加 小
{
p.x[1] += m;
return fix(p);
}
BigInt operator - (BigInt p, int m) // 大 减 小
{
p.x[1] -= m;
return fix(p);
}
BigInt operator * (BigInt p, int m) // 大 乘 小
{
for (int i = 1; i <= p.len; i++)
{
p.x[i] *= m;
}
return fix(p);
}
BigInt operator / (BigInt p, int m) // 大 除 小
{
int x = 0;
BigInt c;
c.len = p.len;
for (int i = c.len; i > 0; i--)
{
c.x[i] = (x * 10 + p.x[i]) / m;
x = (x * 10 + p.x[i]) % m;
}
return fix(c);
}
bool operator < (BigInt p, BigInt q) // 大 小于 大
{
if (p.len < q.len) return true;
if (p.len > q.len) return false;
for (int i = p.len; i > 0; i--)
{
if (p.x[i] < q.x[i]) return true;
if (p.x[i] > q.x[i]) return false;
}
return false;
}
bool operator == (BigInt p, BigInt q) // 大 等于 大
{
if (p.len != q.len) return false;
for (int i = p.len; i > 0; i--)
{
if (p.x[i] != q.x[i]) return false;
}
return true;
}
BigInt operator + (BigInt p, BigInt q) // 大 加 大
{
BigInt c;
c.len = max(p.len, q.len);
for (int i = 1; i <= c.len; i++)
{
c.x[i] = p.x[i] + q.x[i];
}
return fix(c);
}
BigInt operator - (BigInt p, BigInt q) // 大 减 大
{
for (int i = 1; i <= p.len; i++)
{
p.x[i] -= q.x[i];
}
return fix(p);
}
BigInt operator * (BigInt p, BigInt q) // 大 乘 大
{
BigInt c;
c.len = p.len + q.len;
for (int i = 1; i <= p.len; i++)
{
for (int j = 1; j <= q.len; j++)
{
c.x[i + j - 1] += p.x[i] * q.x[j];
}
}
if (c.x[c.len] == 0) c.len--;
return fix(c);
}
BigInt operator / (BigInt p, BigInt q) // 大 除 大
{
BigInt c;
int s = 0;
while (p.len > q.len)
{
q = q * 10;
s++;
}
while (s >= 0)
{
c = c * 10;
while (q < p || q == p)
{
c = c + 1;
p = p - q;
}
q = q / 10;
s--;
}
return fix(c);
}
BigInt operator % (BigInt p, int m) // 大 模 小
{
BigInt c = p / m;
p = p - c * m;
return fix(p);
}
int main()
{
string s1, s2;
cin >> s1 >> s2;
BigInt a(s1), b(s2);
// cout << a + b << "\n";
// cout << a - b << "\n"; 有错
// cout << a * b << "\n";
// cout << a / b << "\n"; 有错
return 0;
}