版权声明:转载请注明出处 https://blog.csdn.net/qq_41593522/article/details/83993889
题意
高精,各种高精
题解
略
调试记录
无
struct longint{
int a[maxl], len, opt;
longint(){ memset(a, 0, sizeof a); len = 0; opt = 1; }
//read & write
void read(){
char str[maxl]; scanf("%s", str + 1);
for (int i = strlen(str + 1); i >= 1; i--)
a[strlen(str + 1) - i + 1] = (str[i] & 15);
len = strlen(str + 1);
}
void write(){
if (opt == -1) putchar('-');
for (int i = len; i >= 1; i--) putchar(a[i] + 48);
putchar('\n');
}
//compare
bool operator == (longint x){
if (len != x.len) return false;
for (int i = len; i >= 1; i--)
if (a[i] != x.a[i]) return false;
return true;
}
bool operator > (longint x){
if (len > x.len) return true;
if (len < x.len) return false;
for (int i = len; i >= 1; i--)
if (a[i] > x.a[i]) return true;
else if (a[i] < x.a[i]) return false;
return false;
}
bool operator < (longint x){ return !(*this > x) && !(*this == x); }
bool operator <=(longint x){ return !(*this > x); }
bool operator >=(longint x){ return !(*this < x); }
//calculate
longint operator +(longint x){
longint res; res.len = max(x.len, len);
for (int i = 1; i <= max(x.len, len); i++){
res.a[i] += x.a[i] + a[i];
if (res.a[i] > 9){
res.a[i + 1] += res.a[i] / 10;
res.a[i] %= 10;
}
}
if (res.a[res.len + 1] != 0) res.len++;
while (res.a[res.len] > 9){
res.a[res.len + 1] = res.a[res.len] / 10;
res.a[res.len++] %= 10;
}
return res;
}
longint operator +(int x){
longint res = *this;
res.a[1] += x;
int i = 1;
while (res.a[i] > 9) res.a[i + 1] += res.a[i] / 10, res.a[i] %= 10, ++i;
res.len = max(res.len, i);
return res;
}
longint operator -(longint x){
longint res = *this;
if (res < x) swap(res, x), res.opt = -1;
res.len = max(res.len, x.len);
for (int i = 1; i <= res.len; i++){
res.a[i] -= x.a[i];
if (res.a[i] < 0){
res.a[i] += 10;
res.a[i + 1]--;
}
}
while (res.a[res.len] == 0 && res.len > 1) res.len--;
return res;
}
longint operator *(longint x){
longint res; res.len = len + x.len;
for (int i = 1; i <= len; i++)
for (int j = 1; j <= x.len; j++)
res.a[i + j - 1] += a[i] * x.a[j];
for (int i = 1; i <= res.len; i++)
if (res.a[i] > 9){
res.a[i + 1] += res.a[i] / 10;
res.a[i] %= 10;
}
while (res.a[res.len] == 0 && res.len > 1) res.len--;
return res;
}
longint operator *(int x){
longint res = *this;
for (int i = 1; i <= res.len; i++){
res.a[i] *= x;
}
for (int i = 1; i <= res.len; i++)
if (res.a[i] > 9){
res.a[i + 1] += res.a[i] / 10, res.a[i] %= 10;
if (i == res.len) res.len = res.len + 1;
}
while (res.a[res.len] > 9){
res.a[res.len + 1] += res.a[res.len] / 10;
res.a[res.len++] %= 10;
}
return res;
}
longint operator /(int x){
longint res;
int d = 0;
for (int i = len; i >= 1; i--){
res.a[i] = (d * 10 + a[i]) / x;
d = (d * 10 + a[i]) % x;
}
res.len = len;
while (res.a[res.len] == 0 && res.len > 1) res.len--;
return res;
}
};