由于类中各函数存在依赖关系,此处为整份代码。请求检查
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
class BigInteger {
int store[3000];
int len, radix;
bool positive;
void tidy() {
bool flag = false;
for (int i = 0; i <= len; i++) {
if (store[i] >= radix)
flag = true,
store[i + 1] += store[i] / radix,
store[i] %= radix;
while (store[i] < 0) {
flag = true,
store[i + 1] --,
store[i] += radix;
}
if (flag || store[len])len++, flag = false;
}
while (len > 1 && store[len - 1] == 0)len--;
}
int newStore[6000], newLen;
public:
BigInteger() {
}
bool operator <(BigInteger &b) {
if (positive && (!b.positive))return false;
if (!positive&&b.positive)return true;
if (positive) {
if (len < b.len)return true;
else if (len > b.len)return false;
}
else {
if (len > b.len)return true;
else if (len < b.len)return false;
}
for (int i = 0; i < len; i++) {
if (this->store[i] < b.store[i])return true;
if (this->store[i] > b.store[i])return false;
}
return false;
}
bool operator ==(BigInteger &b) {
if (len ^ b.len)return false;
if (positive ^ b.positive)return false;
for (int i = 0; i < len; i++)if (store[i] ^ b.store[i])return false;
return true;
}
bool operator !=(BigInteger &b) {
return !(*this == b);
}
bool operator >(BigInteger &b) {
return (!(*this < b) && (*this != b));
}
bool operator <=(BigInteger &b) {
return !(*this > b);
}
bool operator >=(BigInteger &b) {
return !(*this < b);
}
BigInteger& operator =(BigInteger &b) {
radix = b.radix;
memcpy(store, b.store, sizeof b.store);
positive = b.positive;
len = b.len;
return *this;
}
BigInteger& operator +(BigInteger &b) {
return (*new BigInteger(*this) += b);
}
BigInteger& operator +=(BigInteger &b) {
b >> this->radix;
int longer = len < b.len ? b.len : len;
if (positive^b.positive) {
if (positive) {
BigInteger temp(b);
temp.positive = true;
return *this -= temp;
}
else {
positive = true;
return (*this = (b - *this));
}
}
for (int i = 0; i < longer; i++)
store[i] += b.store[i];
tidy();
return *this;
}
BigInteger& operator -(BigInteger &b) {
return (*new BigInteger(*this) -= b);
}
BigInteger& operator -=(BigInteger &b) {
if (positive^b.positive) {
if (positive) {
BigInteger temp(b);
temp.positive = true;
return (*this -= temp);
}
else {
positive = true;
return (*this = b - *this);
}
}
if ((*this) < b) {
(*this) = b - (*this);
positive = false;
return *this;
}
if (*this == b) {
memset(store, 0, sizeof store);
len = 1;
positive = true;
radix = 10;
return *this;
}
for (int i = 0; i < len; i++)
store[i] -= b.store[i];
tidy();
return *this;
}
BigInteger& operator *(int b) {
return (*new BigInteger(*this) *= b);
}
BigInteger& operator *=(int b) {
int pusher[30000];
memset(pusher, 0, sizeof pusher);
for (int i = 0; i < len; i++) {
int current = i;
store[current] *= b;
while (store[current] >= 10) {
pusher[current + 1] += store[current] / 10;
store[current] %= 10;
current++;
}
if (current + 1 > len) len = current + 1;
}
for (int i = 0; i < len; i++)
store[i] += pusher[i];
tidy();
while (store[len] == 0 && len > 1) len--;
}
BigInteger& operator >> (int targetRadix) {
if (radix == targetRadix)return *this;
memset(newStore, 0, sizeof newStore);
newLen = 0;
while (len) {
for (int i = len - 1; i > 0; i--) {
store[i - 1] += store[i] % targetRadix*radix;
store[i] /= targetRadix;
}
newStore[newLen++] = store[0] % targetRadix;
store[0] /= targetRadix;
while (len > 0 && !store[len - 1])len--;
}
memcpy(store, newStore, sizeof newStore);
len = newLen;
radix = targetRadix;
return *this;
}
void read(int radix, string temp) {
memset(store, 0, sizeof store);
if (temp[0] == '-')positive = false, temp = temp.substr(1);
else positive = true;
for (int i = 0; i < temp.length(); i++)
store[temp.length() - 1 - i] =
temp[i] <= '9' ? temp[i] - '0' :
(temp[i] < 'z' ? temp[i] - 'a' + 10 :
temp[i] - 'A' + 10);
len = temp.length();
this->radix = radix;
}
friend istream& operator >> (istream &in, BigInteger &a) {
memset(a.store, 0, sizeof a.store);
string temp;
in >> a.radix >> temp;
if (temp[0] == '-')a.positive = false, temp = temp.substr(1);
else a.positive = true;
for (int i = 0; i < temp.length(); i++)
a.store[temp.length() - 1 - i] =
temp[i] <= '9' ? temp[i] - '0' :
(temp[i] < 'z' ? temp[i] - 'a' + 10 :
temp[i] - 'A' + 10);
a.len = temp.length();
/*if (temp[0] == '-')a.positive = false;
else a.positive = true;
for (int i = 0; i < temp.length(); i++) {
a.multiply(radix);
if (temp[i] >= 'a'&&temp[i] <= 'z')a.store[0] += temp[i] - 'a' + 10;
if (temp[i] >= '0'&&temp[i] <= '9')a.store[0] += temp[i] - '0';
a.tidy();
}
a.radix = 10;*/
return in;
}
friend ostream& operator <<(ostream &out, BigInteger &a) {
if (!a.positive)putchar('-');
for (int i = a.len - 1; i >= 0; i--) {
putchar(
a.store[i] < 10 ? a.store[i] + '0' :
a.store[i] < 36 ? a.store[i] - 10 + 'a' :
a.store[i] - 10 + 'A'
);
}
return out;
}
};
int main() {
/*ios::sync_with_stdio(false);
for (int i = -1000; i < 1000; i++) {
for (int j = -1000; j < 1000; j++) {
char bufferi[1000]; sprintf(bufferi, "%d", i);
char bufferj[1000]; sprintf(bufferj, "%d", j);
BigInteger a, b; a.read(10, bufferi); b.read(10, bufferj);
cout << i << "+" << j << endl;
cout << i + j << endl << a + b << endl << endl;
}
}*/
int a, b; cin >> a >> b;
char bufferi[1000]; sprintf(bufferi, "%d", a);
char bufferj[1000]; sprintf(bufferj, "%d", b);
BigInteger A, B; A.read(10, bufferi); B.read(10, bufferj);
cout << A + B;
}