当遇到一些数据范围超大的毒瘤题时(如),一般需要使用高精度进行计算。
今天,本蒟蒻花了两个小时写成了c++程序,在这儿。欢迎大家阅读和评论(喷)!如果有错,请及时提出哦!^_^
如果你不想点任何链接,可以往下看我的c++程序。
#include <bits/stdc++.h>
using namespace std;
struct hpint {
string val;
};
void check(hpint x) {
for (char i : x.val) {
if (!isdigit(i)) {
cout << "Math Error: High Precision Integer is negative or it is not a number.\n";
exit(1);
}
}
}
bool operator< (hpint a, hpint b) {
check(a);
check(b);
string aval = a.val, bval = b.val;
return aval.size() < bval.size() || (aval.size() == bval.size() && aval < bval);
}
bool operator> (hpint a, hpint b) {
check(a);
check(b);
string aval = a.val, bval = b.val;
return aval.size() > bval.size() || (aval.size() == bval.size() && aval > bval);
}
bool operator== (hpint a, hpint b) {
check(a);
check(b);
return a.val == b.val;
}
hpint operator- (hpint a, hpint b) {
if (a < b) {
cout << "Math Error: High Precision Integer is negative or it is not a number.\n";
exit(1);
}
check(a);
check(b);
string aval = a.val, bval = b.val;
string ret;
int j = (int)aval.size(), abd = 0;
for (int i = bval.size(); i --; ) {
j --;
if (aval[j] - '0' - bval[i] + '0' - abd < 0) {
ret += aval[j] - '0' + 10 - bval[i] + '0' - abd + '0';
abd = 1;
} else {
ret += aval[j] - '0' - bval[i] + '0' - abd + '0';
abd = 0;
}
}
for (; j --; ) {
if (aval[j] - '0' - abd < 0) {
ret += aval[j] - '0' + 10 - abd + '0';
abd = 1;
} else {
ret += aval[j] - '0' - abd + '0';
abd = 0;
}
}
while ((int)ret.size() > 1 && ret.back() == '0') {
ret.pop_back();
}
reverse(ret.begin(), ret.end());
hpint ret2;
ret2.val = ret;
return ret2;
}
hpint operator+ (hpint a, hpint b) {
check(a);
check(b);
string aval = a.val, bval = b.val;
if (a > b) {
swap(aval, bval);
}
string ret;
int car = 0;
int j = bval.size();
for (int i = aval.size(); i --; ) {
j --;
ret += (aval[i] - '0' + bval[j] - '0' + car) % 10 + '0';
car = (aval[i] - '0' + bval[j] - '0' + car) / 10;
}
for (; j --; ) {
ret += (bval[j] - '0' + car) % 10 + '0';
car = (bval[j] - '0' + car) / 10;
}
if (car) {
ret += to_string(car);
}
reverse(ret.begin(), ret.end());
if ((int)ret.size() == 0) {
ret = "0";
}
hpint ret2;
ret2.val = ret;
return ret2;
}
hpint operator* (hpint a, hpint b) {
check(a);
check(b);
string aval = a.val, bval = b.val;
if (a < b) {
return b * a;
}
hpint ret;
ret.val = "0";
for (int i = bval.size(); i --; ) {
hpint cur;
cur.val = "0";
for (int j = 0; j < bval[i] - '0'; j ++) {
cur = cur + a;
}
for (int j = 0; j < (int)bval.size() - 1 - i; j ++) {
cur.val += "0";
}
ret = ret + cur;
}
return ret;
}
hpint operator/ (hpint a, hpint b) {
check(a);
check(b);
int i = 0;
string aval = a.val, bval = b.val, ret;
hpint rem;
rem.val = "";
while (i < (int)aval.size()) {
while (i < (int)aval.size() && rem < b) {
rem.val += aval[i];
i ++;
}
hpint temp;
temp.val = "0";
while (b * temp < rem || b * temp == rem) {
hpint one;
one.val = "1";
temp = temp + one;
}
hpint one;
one.val = "1";
temp = temp - one;
ret += temp.val;
rem = rem - b * temp;
if (rem.val == "0") {
rem.val = "";
}
}
hpint ret2;
ret2.val = ret;
return ret2;
}
hpint operator% (hpint a, hpint b) {
check(a);
check(b);
return a - a / b * b;
}