高精度模板
xiayicheng 的高精模板,可自取
介绍
各变量作用
变量名 | 作用 |
---|---|
\(len\) | 存储数字长度 |
\(symbol\) | 存储数字符号,\(1\)为负,\(0\)为正 |
\(s\) | 倒序存储数字 |
功能\(^*\)
- 变量赋值 :\(\texttt{int,char,Bigint}\)
- 比较大小 :\(\texttt{Bigint}\)
- 加减法 :\(\texttt{Bigint}\)
- 乘法 :\(\texttt{Bigint}\)
- 乘方 :\(\texttt{int}\)
- 输入输出
$\small{{}^*以上内容\color{red}均已重载运算符} $
代码
点击查看代码
#include<bits/stdc++.h>
#define Open(i) freopen(i".in", "r", stdin), freopen(i".out", "w", stdout);
#define Quick ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define FOR(i, l, r) for (int i = (l); i < (r); i++)
#define ROF(i, l, r) for (int i = (l) - 1; i >= (r); i--)
#ifndef ONLINE_JUDGE
#include "algo/debug.h"
#else
#define debug(...) 42
#define debug2(...) 42
#endif
#define MAXN 10010
using namespace std;
struct Bigint
{
int len, s[MAXN], symbol;
Bigint()
{
memset(s, 0, sizeof(s));
len = 1;
symbol = 0;
}
inline Bigint operator = (const char*num)
{
Bigint();
if (num[0] == '-')
{
symbol = 1;
len = strlen(num) - 1;
for (int i = 1; i <= len; ++i)
s[i - 1] = num[len - i + 1] - '0';
}
else
{
symbol = 0;
len = strlen(num);
for (int i = 0; i < len; ++i)
s[i] = num[len - i - 1] - '0';
}
return *this;
}
inline Bigint operator = (const int num)
{
char a[MAXN];
if (num < 0)
{
sprintf(a, "%d", 0 - num);
*this = a;
symbol = 1;
}
else
{
sprintf(a, "%d", num);
*this = a;
symbol = 0;
}
return *this;
}
inline Bigint (const int num)
{
*this = num;
}
inline Bigint (const char * num)
{
*this = num;
}
inline Bigint operator = (const Bigint &a)
{
symbol = a.symbol;
len = a.len;
FOR(i, 0, len)
s[i] = a.s[i];
return *this;
}
inline int unsigned_cmp(const Bigint &a)
{
if (len > a.len)
return 1;
else if (len < a.len)
return -1;
else
{
// cout<<1;
for (int i = len - 1; i >= 0; i--)
{
if (s[i] > a.s[i])
return 1;
else if (s[i] < a.s[i])
return -1;
}
}
return 0;
}
inline int cmp (const Bigint &a)
{
if (a.symbol != symbol)
{
if (a.symbol == 1)
return 1;
else
return -1;
}
else
{
if (symbol == 0)
return unsigned_cmp(a);
else
return 0 - unsigned_cmp(a);
}
}
inline bool operator > (const Bigint &a)
{
int tmp = cmp(a);
if (tmp == 1)
return true;
else
return false;
}
inline bool operator == (const Bigint &a)
{
int tmp = cmp(a);
if (tmp == 0)
return true;
else
return false;
}
inline bool operator < (const Bigint &a)
{
int tmp = cmp(a);
if (tmp == -1)
return true;
else
return false;
}
inline bool operator >= (const Bigint &a)
{
int tmp = cmp(a);
if (tmp == 1 or tmp == 0)
return true;
else
return false;
}
inline bool operator <= (const Bigint &a)
{
int tmp = cmp(a);
if (tmp == -1 or tmp == 0)
return true;
else
return false;
}
inline Bigint unsigned_plus (const Bigint &a)
{
Bigint c;
c.len = max(len, a.len) + 1;
for (int i = 0, x = 0; i < c.len; ++i)
{
c.s[i] = s[i] + a.s[i] + x;
x = c.s[i] / 10;
c.s[i] = c.s[i] % 10;
}
if (c.s[c.len - 1] == 0)
--c.len;
return c;
}
inline Bigint unsigned_minus (const Bigint &a)
{
Bigint c;
c.len = max(len, a.len) + 1;
for (int i = 0, x = 0; i < c.len; ++i)
{
c.s[i] = s[i] - a.s[i] - x;
if (c.s[i] < 0)
c.s[i] += 10, x = 1;
else
x = 0;
}
for (int i = c.len - 1; i >= 0; i--)
{
// cout<<len<<" ";
if (c.s[i] == 0)
--c.len;
else
break;
}
return c;
}
inline Bigint operator + (Bigint &a)
{
if (symbol == a.symbol)
{
if (symbol == 0)
{
Bigint c = unsigned_plus(a);
c.symbol = 0;
return c;
}
else
{
Bigint c = unsigned_plus(a);
c.symbol = 1;
return c;
}
}
else
{
if (symbol == 0)
{
if (unsigned_cmp(a) != -1)
{
Bigint c = unsigned_minus(a);
c.symbol = 0;
return c;
}
else
{
Bigint c = *this;
c = a.unsigned_minus(c);
c.symbol = 1;
return c;
}
}
else
{
if (unsigned_cmp(a) != -1)
{
Bigint c = unsigned_minus(a);
c.symbol = 1;
return c;
}
else
{
Bigint c = *this;
c = a.unsigned_minus(c);
c.symbol = 0;
return c;
}
}
}
}
inline Bigint operator - (Bigint &a)
{
if (symbol == a.symbol)
{
if (symbol == 0)
{
// cout<<cmp(a);
if (cmp(a) != -1)
{
Bigint tmp = unsigned_minus(a);
tmp.symbol = 0;
return tmp;
}
else
{
Bigint tmp = *this;
tmp = a.unsigned_minus(tmp);
tmp.symbol = 1;
return tmp;
}
}
else
{
if (unsigned_cmp(a) != -1)
{
Bigint tmp = unsigned_minus(a);
tmp.symbol = 1;
return tmp;
}
else
{
Bigint tmp = *this;
tmp = a.unsigned_minus(tmp);
tmp.symbol = 0;
return tmp;
}
}
}
else
{
if (symbol == 0)
{
Bigint tmp = unsigned_plus(a);
tmp.symbol = 0;
return tmp;
}
else
{
Bigint tmp = unsigned_plus(a);
tmp.symbol = 1;
return tmp;
}
}
}
inline Bigint operator * (const Bigint &x)
{
Bigint c;
c.len = len + x.len;
for (int i = 0; i < len; ++i)
for (int j = 0; j < x.len; ++j)
{
c.s[i + j] += s[i] * x.s[j];
c.s[i + j + 1] += c.s[i + j] / 10;
c.s[i + j] %= 10;
}
for (int i = c.len - 1; i >= 0; i--)
{
if (c.s[i] == 0)
--c.len;
else
break;
}
c.symbol = (symbol != x.symbol);
return c;
}
inline Bigint operator ^ (int x)
{
Bigint c = *this, ans = *this;
for (; x != 1; x >>= 1)
{
ans = ans * c;
if (x % 2 == 1)
ans = ans * c;
c = c * c;
}
return ans;
}
inline void operator += (Bigint &a)
{
*this = *this + a;
}
inline void operator -= (Bigint &a)
{
*this = *this - a;
}
inline void operator *= (const Bigint &a)
{
*this = *this * a;
}
inline void operator ^= (int &a)
{
*this = *this ^ a;
}
};
ostream& operator<<(ostream &out, const Bigint& x)
{
if (x.symbol == 1)
printf("-");
else if (x.len == 0)
printf("0");
for (int i = x.len - 1; i >= 0; --i)
printf("%d", x.s[i]);
return out;
}
istream& operator>>(istream &in, Bigint &x)
{
char num[MAXN];
in >> num;
x = num;
return in;
}