高精度
struct bign
{
int len, s[N];//s[N]里从0~n-1倒序存储大整数,例如12345存储为s[]={5,4,3,2,1},此时len为5
bign() { memset(s, 0, sizeof(s)); len = 1; }
bign(int num) { *this = num; }
bign(char* num) { *this = num; }
bign operator =(int num)
{
char c[N];
sprintf(c, "%d", num);
*this = c;
return *this;
}
bign operator =(const char* num)
{
len = strlen(num);
for (int i = 0; i < len; i++) s[i] = num[len - 1 - i] - '0';
return *this;
}
string str()//转化为string,以便输出
{
string res = "";
if (s[len - 1] < 0) res += '-';
for (int i = len - 1; i >= 0; i--) {
if (s[i] < 0) s[i] = -s[i];
res += s[i] + '0';
}
return res;
}
void clean()//删除前导零
{
while (len > 1 && !s[len - 1]) len--;
}
bool operator <(const bign& b) const
{
if (len != b.len) return len < b.len;
for (int i = len - 1; i >= 0; i--)
if (s[i] != b.s[i]) return s[i] < b.s[i];
return false;
}
bool operator >(const bign& b) const
{
if (len != b.len) return len > b.len;
for (int i = len - 1; i >= 0; i--)
if (s[i] != b.s[i]) return s[i] > b.s[i];
return false;
}
bool operator ==(const bign& b) const
{
if (len != b.len) return false;
for (int i = len - 1; i >= 0; i--)
if (s[i] != b.s[i]) return false;
return true;
}
bign operator +(const bign& b)
{
bign c;
c.len = 0;
for (int i = 0, g = 0; g || i < len || i < b.len; i++)
{
int x = g;
if (i < len) x += s[i];
if (i < b.len) x += b.s[i];
c.s[c.len++] = x % 10;
g = x / 10;
}
c.clean();
return c;
}
bign operator-(const bign& T) const {
int l_len;
bool ctf;
bign t1, t2;
if (*this < T) {
t1 = T;
t2 = *this;
ctf = 1;
}
else {
t1 = *this;
t2 = T;
ctf = 0;
}
l_len = t1.len;
int j = 0;
for (int i = 0; i < l_len; i++) {
t1.s[i] -= t2.s[i];
if (t1.s[i] < 0) { t1.s[i + 1]--; t1.s[i] += 10; }
}
//len++;
t1.len = l_len;
t1.clean();
if (ctf) t1.s[t1.len - 1] = -t1.s[t1.len - 1];
return t1;
}
bign operator *(const bign& b)
{
bign c;
c.len = len + b.len;
for (int i = 0; i < len; i++)for (int j = 0; j < b.len; j++)c.s[i + j] += s[i] * b.s[j];
for (int i = 0; i < c.len - 1; i++) { c.s[i + 1] += c.s[i] / 10; c.s[i] %= 10; }
c.clean();
return c;
}
bign operator/(const int& b) {//高精/单精
bign res;
int down = 0;
for (int i = len - 1; i >= 0;i--) {
res.s[i] = (s[i] + down * (10)) / b;
down = s[i] + down * (10) - res.s[i] * b;
}
res.len = len;
res.clean();
return res;
}
int operator%(const int& b) {//高精%单精
int d = 0;
for (int i = len - 1; i >= 0; i--)
d = (d * (10) % b + s[i]) % b;
return d;
}
bign operator +=(const bign& b)
{
*this = *this + b;
return *this;
}
bign operator -=(const bign& b)
{
*this = *this - b;
return *this;
}
friend istream& operator>>(istream& in, bign& x) {
string s;
in >> s;
x = s.c_str();
return in;
}
friend ostream& operator<<(ostream& out, bign& x)
{
out << x.str();
return out;
}
};Last updated