rt
实在是不知道怎么优化了.jpg
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Bigint
{
string s;
Bigint(string a)
{
this->s = a;
}
bool operator<(Bigint q)
{
string a = this->s, b = q.s;
if (a[0] == '-' || b[0] == '-')
{
if (a[0] == '-' && b[0] == '-')
{
a.erase(0, 1);
b.erase(0, 1);
if (a.length() < b.length())
return 0;
if (a.length() > b.length())
return 1;
return (a > b) ? 1 : 0;
}
else if (a[0] == '-')
return 1;
else if (b[0] == '-')
return 0;
}
if (a.length() < b.length())
return 1;
if (a.length() > b.length())
return 0;
return (a < b) ? 1 : 0;
}
bool operator<=(Bigint q)
{
if ((*this) < q)
return 1;
if ((this->s) == q.s)
return 1;
return 0;
}
Bigint operator+(Bigint q)
{
string a = this->s, b = q.s;
long long len1 = a.length(), len2 = b.length();
bool min = 0;
if (a[0] == '-' || b[0] == '-')
{
if ((a[0] == '-') && (b[0] == '-'))
{
a.erase(0, 1);
b.erase(0, 1);
len1--;
len2--;
min = 1;
}
else if (a[0] == '-')
{
this->s.erase(0, 1);
return q - (*this);
}
else
{
q.s.erase(0, 1);
return (*this) - q;
}
}
if (len1 < len2)
{
while (len1 != len2)
{
a = "0" + a;
len1++;
}
}
else if (len1 > len2)
{
while (len1 != len2)
{
b = "0" + b;
len2++;
}
}
int c[len1 + 5];
memset(c, 0, sizeof(c));
for (long long i = len1 - 1; i >= 1; i--)
{
c[i] += int(a[i] + b[i] - int(2 * '0'));
c[i - 1] += c[i] / 10;
c[i] %= 10;
}
string ans;
c[0] += int(a[0] + b[0] - int(2 * '0'));
if (c[0] / 10)
{
ans = char(c[0] / 10 + '0');
c[0] %= 10;
}
for (long long i = 0; i < len1; i++)
ans = ans + char(c[i] + '0');
if (min)
ans = '-' + ans;
return Bigint(ans);
}
Bigint operator-(Bigint q)
{
string a = this->s, b = q.s, ans = "";
bool min = 0, zero = 1;
if (a[0] == '-' || b[0] == '-')
{
if (a[0] == '-' && b[0] == '-')
{
a.erase(0, 1);
b.erase(0, 1);
min = 1;
}
else if (a[0] == '-')
{
this->s.erase(0, 1);
return ("-" + ((*this) + q).s);
}
else if (b[0] == '-')
{
q.s.erase(0, 1);
return (*this) + q;
}
}
long long len1 = a.length(), len2 = b.length();
if (len1 < len2)
{
while (len1 != len2)
{
a = "0" + a;
len1++;
}
}
else if (len1 > len2)
{
while (len1 != len2)
{
b = "0" + b;
len2++;
}
}
if (a < b)
{
min = !min;
swap(a, b);
}
int c[len1 + 5];
memset(c, 0, sizeof(c));
for (long long i = len1 - 1; i > 0; i--)
{
c[i] += a[i] - b[i];
if (c[i] < 0)
{
c[i] += 10;
c[i - 1]--;
}
}
c[0] += a[0] - b[0];
for (long long i = 0; i < len1; i++)
{
if (c[i] == 0 && zero)
continue;
zero = 0;
ans = ans + char(c[i] + '0');
}
if (ans == "")
ans = "0";
if (min)
ans = "-" + ans;
return Bigint(ans);
}
Bigint operator*(Bigint q)
{
string a = this->s, b = q.s, ans = "";
bool min = 0;
if (a[0] == '-' && b[0] == '-')
{
a.erase(0, 1);
b.erase(0, 1);
}
else if (a[0] == '-')
{
min = 1;
a.erase(0, 1);
}
else if (b[0] == '-')
{
min = 1;
b.erase(0, 1);
}
long long len1 = a.length(), len2 = b.length();
int c[len1 + len2 + 5];
memset(c, 0, sizeof(c));
a = "0" + a;
b = "0" + b;
for (long long i = len1; i > 0; i--)
{
for (long long j = len2; j > 0; j--)
{
c[len1 + len2 - i - j + 1] += (a[i] - '0') * (b[j] - '0');
c[len1 + len2 - i - j + 2] += c[len1 + len2 - i - j + 1] / 10;
c[len1 + len2 - i - j + 1] %= 10;
}
}
for (long long i = 1; i < len1 + len2; i++)
ans = char(c[i] + '0') + ans;
if (c[len1 + len2])
ans = char(c[len1 + len2] + '0') + ans;
if (min)
ans = "-" + ans;
return Bigint(ans);
}
Bigint operator/(Bigint q)
{
string a = this->s, b = q.s;
if ((*this) < q)
return Bigint("0");
if (b == "0")
return Bigint("Error");
unsigned long long len1 = a.length(), len2 = b.length(), sum = 0;
string ans = "", use = a.substr(0, len2);
a.erase(0, len2);
if (use < b)
{
use = use + a.substr(0, 1);
a.erase(0, 1);
}
while (q <= Bigint(use))
{
sum++;
use = (Bigint(use) - q).s;
}
ans = char(sum + '0');
while (1)
{
if (a == "")
return Bigint(ans);
sum = 0;
use = use + a.substr(0, 1);
a.erase(0, 1);
while (q <= Bigint(use))
{
sum++;
use = (Bigint(use) - q).s;
}
ans = ans + char(sum + '0');
}
}
Bigint operator%(Bigint q)
{
string a = this->s, b = q.s;
if ((*this) < q)
return *this;
if (b == "0")
return Bigint("Error");
long long len1 = a.length(), len2 = b.length(), sum = 0;
string ans = "", use = a.substr(0, len2);
a.erase(0, len2);
if (use < b)
{
use = use + a.substr(0, 1);
a.erase(0, 1);
}
while (q <= Bigint(use))
{
sum++;
use = (Bigint(use) - q).s;
}
ans = char(sum + '0');
while (1)
{
if (a == "")
return Bigint(use);
sum = 0;
use = use + a.substr(0, 1);
a.erase(0, 1);
while (q <= Bigint(use))
{
sum++;
use = (Bigint(use) - q).s;
}
ans = ans + char(sum + '0');
}
}
};
int main()
{
freopen("P1932_10.in","r",stdin);
freopen("666.out","w",stdout);
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Bigint a("0"), b("0"), d("0");
cin >> a.s >> b.s;
cout << (a + b).s << endl
<< (a - b).s << endl
<< (a * b).s << endl
<< (a / b).s << endl
<< (a % b).s;
return 0;
}