高精度封装
qinshi0308 · · 科技·工程
自己写的高精度封装
目前正在开发 & 调试中,如果有发现 bug 可以私信或写在评论区,最好具体一点,能给出解决方案更好。
具体说明详见代码注释,文件后缀名为 .hpp。
编译器:tdm64-gcc-10.3.0-2
编译参数:
-std=c++14 -O2
转载请注明出处。
//高精度封装
//目前实现高精加和高精减,仅支持参与运算的数和结果均为非负数的情况
//其他等待开发
//负数处理也等待开发
//支持使用标准流(istream & ostream)输入 & 输出
//支持使用文件流(ifstream & ofstream)输入 & 输出
//创建变量时不指定位数上限时默认为MIN_SIZE
//MIN_SIZE :高精度位数上限的最小值,可修改,不建议过大(内存开不下)或过小(会炸)
//.size() :存储的数的长度
//.max_size() :存储的数的位数上线
//.clear() :清空(重新初始化)
//.read() :读入
//.fread() :文件读入
//.write() :输出
//.frite() :文件输出
//make_int_n() :将系统自带类型的整数转换为int_n类型
//updata 2024/8/1 初步完成代码骨架,完成I/O和高精加/减,不支持负数,支持标准流输入输出
//updata 2024/8/2 支持文件流输入输出,初步实现处理负数,支持基本逻辑运算(== != > < >= <=)
//uptata 2024/8/3 完成负号(-)和自增 & 自减 (前缀++ 后缀++ 前缀-- 后缀--)的重载,发现减法出锅,未能解决问题
//updata 2024/8/4 修锅(减法),开始高精乘法的编写
//updata 2024/8/5 继续写高精乘
//如果显示乱码,请检查编码是否为UTF-8,若否,请用UTF-8编码打开文件
//If garbled characters are displayed, please check if the encoding is UTF-8. If not, please open the file using UTF-8 encoding.
//by qinshi0308 (https://www.luogu.com.cn/user/672237)
//鸣谢:ysq20110325 (https://www.luogu.com.cn/user/901562)(帮忙debug)
# ifndef high_precision_hpp
# define high_precision_hpp
# define debug
# include <bits/stdc++.h>
using namespace std;
namespace high_precision {
struct int_n;
inline int_n abs(int_n a);
inline int_n addition(int_n a,int_n b);
inline int_n subtraction(int_n a,int_n b);
inline int_n multiplication(int_n a,int_n b);
inline int_n division(int_n a,int_n b);
inline int_n delivery(int_n a,int_n b);
// inline void swap(int_n&a,int_n &b);
template<typename T>
inline int_n make_int_n(T x);
bool operator==(int_n a,int_n b);
bool operator!=(int_n a,int_n b);
bool operator>(int_n a,int_n b);
bool operator<(int_n a,int_n b);
bool operator>=(int_n a,int_n b);
bool operator<=(int_n a,int_n b);
int_n operator-(int_n a);
int_n operator+(int_n a,int_n b);
int_n operator-(int_n a,int_n b);
int_n operator*(int_n a,int_n b);
int_n operator/(int_n a,int_n b);
int_n operator%(int_n a,int_n b);
int_n &operator+=(int_n &a,int_n b);
int_n &operator-=(int_n &a,int_n b);
int_n &operator*=(int_n &a,int_n b);
int_n &operator/=(int_n &a,int_n b);
int_n &operator%=(int_n &a,int_n b);
istream& operator>>(istream &cin,int_n &x);
ostream& operator<<(ostream &cout,int_n x);
ifstream& operator>>(ifstream &fin,int_n &x);
ofstream& operator<<(ofstream &fout,int_n &x);
int MIN_SIZE=1e5+5;
struct int_n{
int __size=0,__max_size=0;
bool negative=0;
int* num=NULL;
int_n(int _max_size=MIN_SIZE){
num=new int [_max_size];
__max_size=_max_size;
fill(num,num+__max_size,0);
}
inline void del(){
delete num;
}
int_n &operator=(const int_n &x){
this->__size=x.__size;
this->negative=x.negative;
for(int i=0;i<x.__size;i++){
this->num[i]=x.num[i];
}
return *this;
}
int_n operator++(int){
int_n a=*this;
(*this)+=make_int_n(1);
return a;
}
int_n &operator++(){
return (*this)+=make_int_n(1);
}
int_n operator--(int){
int_n a=*this;
(*this)-=make_int_n(1);
return a;
}
int_n &operator--(){
return (*this)-=make_int_n(1);
}
inline int size(){
return __size;
}
inline int max_size(){
return __max_size;
}
inline void clear(){
fill(num,num+__max_size,0);
__size=0;
}
inline void read(istream &cin){
string s;
cin>>s;
__size=s.size();
if(s[0]=='-'){
negative=1;
__size--;
}
for(int i=0,j=s.size()-1;i<__size;i++,j--){
num[i]=s[j]-'0';
}
}
inline void fread(ifstream &fin){
string s;
fin>>s;
__size=s.size();
if(s[0]=='-'){
negative=1;
__size--;
}
for(int i=0,j=s.size()-1;i<__size;i++,j--){
num[i]=s[j]-'0';
}
}
inline void write(ostream &cout){
bool f=1;
if(negative&&!(__size==1&&num[0]==0)){
cout<<'-';
}
for(int i=__size;i>=0;i--){
if(f&&num[i]==0){
continue;
}else{
f=0;
cout<<char(num[i]+'0');
}
}
if(f){
cout<<0;
}
}
inline void fwrite(ofstream &fout){
bool f=1;
if(negative&&!(__size==1&&num[0]==0)){
cout<<'-';
}
for(int i=__size;i>=0;i--){
if(f&&num[i]==0){
continue;
}else{
f=0;
fout<<char(num[i]+'0');
}
}
if(f){
fout<<0;
}
}
};
int_n operator+(int_n a,int_n b){
int_n ans;
if(a.negative==b.negative&&a.negative==0){
ans=addition(a,b);
ans.negative=0;
}else if(a.negative||b.negative){
int negative=abs(a)>abs(b)?a.negative:b.negative;
if(abs(a)==abs(b)){
negative=0;
}
if(abs(a)<abs(b)){
ans=subtraction(abs(b),abs(a));
}else{
ans=subtraction(abs(a),abs(b));
}
ans.negative=negative;
}else if(a.negative==b.negative&&a.negative==1){
ans=addition(a,b);
ans.negative=1;
}
return ans;
}
int_n operator-(int_n a,int_n b){
return a+(-b);
}
int_n operator*(int_n a,int_n b){
int_n c;
if(a.negative==b.negative){
c=multiplication(abs(a),abs(b));
c.negative=0;
}else{
c=multiplication(abs(a),abs(b));
c.negative=1;
}
return c;
}
int_n operator/(int_n a,int_n b){
int_n c;
if(a.negative==b.negative){
c=division(abs(a),abs(b));
c.negative=0;
}else{
c=division(abs(a),abs(b));
c.negative=1;
}
return c;
}
int_n operator%(int_n a,int_n b){
int_n c;
if(a.negative==b.negative){
c=delivery(abs(a),abs(b));
c.negative=0;
}else{
c=delivery(abs(a),abs(b));
c.negative=1;
}
return c;
}
inline int_n abs(int_n a){
a.negative=0;
return a;
}
inline int_n addition(int_n a,int_n b){
int_n c(max(a.__max_size,b.__max_size)+(a.__size==a.__max_size||b.__size==b.__max_size?1:0));
c.__size=max(a.__size,b.__size);
for(int i=0;i<c.__size;i++){
c.num[i]=a.num[i]+b.num[i];
}
for(int i=0;i<c.__size;i++){
if(c.num[i]>=10){
c.num[i+1]+=c.num[i]/10;
if(i==c.__size-1){
c.__size++;
}
c.num[i]%=10;
}
}
return c;
}
inline int_n subtraction(int_n a,int_n b){
int_n c(max(a.__max_size,b.__max_size)+(a.__size==a.__max_size||b.__size==b.__max_size?1:0));
c.__size=max(a.__size,b.__size);
for(int i=0;i<c.__size;i++){
c.num[i]=a.num[i]-b.num[i];
// cout<<a.num[i]<<" "<<b.num[i]<<endl;
}
// for(int i=c.size()-1;i>=0;i--){
// cout<<c.num[i];
// }
// cout<<endl;
for(int i=0;i<c.__size;i++){
if(c.num[i]<0){
c.num[i+1]--;
if(i==c.__size-1){
c.num[i+1]=0;
c.num[i]=std::abs(c.num[i]);
// c.__size--;
break;
}
c.num[i]+=10;
}
}
return c;
}
inline int_n multiplication(int_n a, int_n b){
int_n c(max(MIN_SIZE,a.size()+b.size()+1));
fill(c.num,c.num+c.max_size(),0);
for(int i=0;i<a.size();i++){
int carry=0;
for(int j=0;j<b.size();j++){
c.num[i+j]+=a.num[i]*b.num[j]+carry;
carry=c.num[i+j]/10;
c.num[i+j]%=10;
}
c.num[i+b.size()]+=carry;
}
c.__size=a.size()+b.size();
while (c.__size>1&&c.num[c.__size-1]==0){
c.__size--;
}
return c;
}
inline int_n division(int_n a,int_n b){
int_n c(max(MIN_SIZE,a.__size-b.__size+1));
c.__size=a.size()-b.size()+1;
int_n re(max(MIN_SIZE,b.__size));
for (int i=a.__size-1;i>=0;i--) {
re*=make_int_n(10);
re+=make_int_n(a.num[i]);
if (re.num[re.__size]!=0) {
re.__size++;
}
int l=0,r=10,mid;
while(l<r) {
mid=(l+r)/2;
int_n t(max(MIN_SIZE,b.size()+2));
t=b*make_int_n(mid);
if(t<=re){
l=mid+1;
}else{
r=mid;
}
}
c.num[i]=l-1;
re-=b*make_int_n(c.num[i]);
}
while(c.__size>1&&c.num[c.__size-1]==0){
c.__size--;
}
return c;
}
inline int_n delivery(int_n a,int_n b){
int_n c(max(MIN_SIZE,a.__size-b.__size+1));
c.__size=a.size()-b.size()+1;
int_n re(max(MIN_SIZE,b.__size));
for (int i=a.__size-1;i>=0;i--) {
re*=make_int_n(10);
re+=make_int_n(a.num[i]);
if (re.num[re.__size]!=0) {
re.__size++;
}
int l=0,r=10,mid;
while(l<r) {
mid=(l+r)/2;
int_n t(max(MIN_SIZE,b.size()+2));
t=b*make_int_n(mid);
if(t<=re){
l=mid+1;
}else{
r=mid;
}
}
c.num[i]=l-1;
re-=b*make_int_n(c.num[i]);
}
while(re.__size>1&&c.num[re.__size-1]==0){
re.__size--;
}
return re;
}
template<typename T>
inline int_n make_int_n(T x){
T _x=x;
int s=0;
while(_x){
s++;
_x/=10;
}
int_n ans(MIN_SIZE);
if(x<0){
x=std::abs(x);
ans.negative=1;
}
ans.__size=s;
for(int i=0;i<s;i++){
ans.num[i]=x%10;
x/=10;
}
return ans;
}
istream& operator>>(istream &cin,int_n &x){
x.read(cin);
return cin;
}
ostream& operator<<(ostream &cout,int_n x){
x.write(cout);
return cout;
}
ifstream& operator>>(ifstream &fin,int_n &x){
x.fread(fin);
return fin;
}
ofstream& operator<<(ofstream &fout,int_n &x){
x.fwrite(fout);
return fout;
}
bool operator==(int_n a,int_n b){
if(a.size()!=b.size()||a.negative!=b.negative){
return 0;
}
for(int i=a.size()-1;i>=0;i--){
if(a.num[i]!=b.num[i]){
return 0;
}
}
return 1;
}
bool operator!=(int_n a,int_n b){
return !(a==b);
}
bool operator>(int_n a,int_n b){
if(a.negative==0&&b.negative==1){
return 1;
}else if(a.negative==1&&b.negative==0){
return 0;
}
if(a.negative==b.negative&&a.negative==1){
if(a.size()!=b.size()){
return a.size()<b.size();
}
for(int i=a.size()-1;i>=0;i--){
if(a.num[i]!=b.num[i]){
return a.num[i]<b.num[i];
}
}
return 0;
}else{
if(a.size()!=b.size()){
return a.size()>b.size();
}
for(int i=a.size()-1;i>=0;i--){
if(a.num[i]!=b.num[i]){
return a.num[i]>b.num[i];
}
}
return 0;
}
}
bool operator<(int_n a,int_n b){
if(a.negative==0&&b.negative==1){
return 0;
}else if(a.negative==1&&b.negative==0){
return 1;
}
if(a.negative==b.negative&&a.negative==1){
if(a.size()!=b.size()){
return a.size()>b.size();
}
for(int i=a.size()-1;i>=0;i--){
if(a.num[i]!=b.num[i]){
return a.num[i]>b.num[i];
}
}
return 0;
}else{
if(a.size()!=b.size()){
return a.size()<b.size();
}
for(int i=a.size()-1;i>=0;i--){
if(a.num[i]!=b.num[i]){
return a.num[i]<b.num[i];
}
}
return 0;
}
}
bool operator>=(int_n a,int_n b){
return a>b||a==b;
}
bool operator<=(int_n a,int_n b){
return a<b||a==b;
}
int_n operator-(int_n a){
a.negative=!a.negative;
return a;
}
int_n &operator+=(int_n &a,int_n b){
a=a+b;
return a;
}
int_n &operator-=(int_n &a,int_n b){
a=a-b;
return a;
}
int_n &operator*=(int_n &a,int_n b){
a=a*b;
return a;
}
int_n &operator/=(int_n &a,int_n b){
a=a/b;
return a;
}
int_n &operator%=(int_n &a,int_n b){
a=a%b;
return a;
}
// inline void swap(int_n &a,int_n &b){
// int_n temp(std::max(MIN_SIZE,max(a.max_size,b.max_size)));
// temp=a;
// a=b;
// b=temp;
// }
// inline int_n max(int_n a,int_n b){
// return (a>=b?a:b);
// }
// inline int_n min(int_n a,int_n b){
// return (a<=b?a:b);
// }
}
# endif
//高精度封装
//目前实现高精加和高精减,仅支持参与运算的数和结果均为非负数的情况
//其他等待开发
//负数处理也等待开发
//支持使用标准流(istream & ostream)输入 & 输出
//支持使用文件流(ifstream & ofstream)输入 & 输出
//创建变量时不指定位数上限时默认为MIN_SIZE
//MIN_SIZE :高精度位数上限的最小值,可修改,不建议过大(内存开不下)或过小(会炸)
//.size() :存储的数的长度
//.max_size() :存储的数的位数上线
//.clear() :清空(重新初始化)
//.read() :读入
//.fread() :文件读入
//.write() :输出
//.frite() :文件输出
//make_int_n() :将系统自带类型的整数转换为int_n类型
//updata 2024/8/1 初步完成代码骨架,完成I/O和高精加/减,不支持负数,支持标准流输入输出
//updata 2024/8/2 支持文件流输入输出,初步实现处理负数,支持基本逻辑运算(== != > < >= <=)
//uptata 2024/8/3 完成负号(-)和自增 & 自减 (前缀++ 后缀++ 前缀-- 后缀--)的重载,发现减法出锅,未能解决问题
//updata 2024/8/4 修锅(减法),开始高精乘法的编写
//updata 2024/8/5 继续写高精乘
//如果显示乱码,请检查编码是否为UTF-8,若否,请用UTF-8编码打开文件
//If garbled characters are displayed, please check if the encoding is UTF-8. If not, please open the file using UTF-8 encoding.
//by qinshi0308 (https://www.luogu.com.cn/user/672237)
//鸣谢:ysq20110325 (https://www.luogu.com.cn/user/901562)(帮忙debug)
# ifndef high_precision_hpp
# define high_precision_hpp
# define debug
# include <bits/stdc++.h>
using namespace std;
namespace high_precision {
struct int_n;
inline int_n abs(int_n a);
inline int_n addition(int_n a,int_n b);
inline int_n subtraction(int_n a,int_n b);
inline int_n multiplication(int_n a,int_n b);
inline int_n division(int_n a,int_n b);
inline int_n delivery(int_n a,int_n b);
// inline void swap(int_n&a,int_n &b);
template<typename T>
inline int_n make_int_n(T x);
bool operator==(int_n a,int_n b);
bool operator!=(int_n a,int_n b);
bool operator>(int_n a,int_n b);
bool operator<(int_n a,int_n b);
bool operator>=(int_n a,int_n b);
bool operator<=(int_n a,int_n b);
int_n operator-(int_n a);
int_n operator+(int_n a,int_n b);
int_n operator-(int_n a,int_n b);
int_n operator*(int_n a,int_n b);
int_n operator/(int_n a,int_n b);
int_n operator%(int_n a,int_n b);
int_n &operator+=(int_n &a,int_n b);
int_n &operator-=(int_n &a,int_n b);
int_n &operator*=(int_n &a,int_n b);
int_n &operator/=(int_n &a,int_n b);
int_n &operator%=(int_n &a,int_n b);
istream& operator>>(istream &cin,int_n &x);
ostream& operator<<(ostream &cout,int_n x);
ifstream& operator>>(ifstream &fin,int_n &x);
ofstream& operator<<(ofstream &fout,int_n &x);
int MIN_SIZE=1e4+5;
struct int_n{
bool negative=0;
vector<int> num;
int_n &operator=(const int_n &x) {
this->negative = x.negative;
this->num = x.num;
return *this;
}
int_n operator++(int){
int_n a=*this;
(*this)+=make_int_n(1);
return a;
}
int_n &operator++(){
return (*this)+=make_int_n(1);
}
int_n operator--(int){
int_n a=*this;
(*this)-=make_int_n(1);
return a;
}
int_n &operator--(){
return (*this)-=make_int_n(1);
}
inline int size(){
return num.size();
}
// inline int max_size(){
// return num.size();
// }
inline void clear(){
num.clear();
}
inline void read(istream &cin){
string s;
cin>>s;
if(s[0]=='-'){
negative=1;
}
for(int i=0,j=s.size()-1;i<num.size();i++,j--){
num.push_back(s[j]-'0');
}
}
inline void fread(ifstream &fin){
string s;
fin>>s;
if(s[0]=='-'){
negative=1;
}
for(int i=0,j=s.size()-1;i<num.size();i++,j--){
num.push_back(s[j]-'0');
}
}
inline void write(ostream &cout){
bool f=1;
if(negative&&!(num.size()==1&&num[0]==0)){
cout<<'-';
}
for(int i=num.size();i>=0;i--){
if(f&&num[i]==0){
continue;
}else{
f=0;
cout<<char(num[i]+'0');
}
}
if(f){
cout<<0;
}
}
inline void fwrite(ofstream &fout){
bool f=1;
if(negative&&!(num.size()==1&&num[0]==0)){
cout<<'-';
}
for(int i=num.size();i>=0;i--){
if(f&&num[i]==0){
continue;
}else{
f=0;
fout<<char(num[i]+'0');
}
}
if(f){
fout<<0;
}
}
};
int_n operator+(int_n a,int_n b){
int_n ans;
if(a.negative==b.negative&&a.negative==0){
ans=addition(a,b);
ans.negative=0;
}else if(a.negative||b.negative){
int negative=abs(a)>abs(b)?a.negative:b.negative;
if(abs(a)==abs(b)){
negative=0;
}
if(abs(a)<abs(b)){
ans=subtraction(abs(b),abs(a));
}else{
ans=subtraction(abs(a),abs(b));
}
ans.negative=negative;
}else if(a.negative==b.negative&&a.negative==1){
ans=addition(a,b);
ans.negative=1;
}
return ans;
}
int_n operator-(int_n a,int_n b){
return a+(-b);
}
int_n operator*(int_n a,int_n b){
int_n c;
if(a.negative==b.negative){
c=multiplication(abs(a),abs(b));
c.negative=0;
}else{
c=multiplication(abs(a),abs(b));
c.negative=1;
}
return c;
}
int_n operator/(int_n a,int_n b){
int_n c;
if(a.negative==b.negative){
c=division(abs(a),abs(b));
c.negative=0;
}else{
c=division(abs(a),abs(b));
c.negative=1;
}
return c;
}
int_n operator%(int_n a,int_n b){
int_n c;
if(a.negative==b.negative){
c=delivery(abs(a),abs(b));
c.negative=0;
}else{
c=delivery(abs(a),abs(b));
c.negative=1;
}
return c;
}
inline int_n abs(int_n a){
a.negative=0;
return a;
}
inline int_n addition(int_n a,int_n b){
int_n c;
for(int i=0;i<c.num.size();i++){
c.num[i]=a.num[i]+b.num[i];
}
for(int i=0;i<c.num.size();i++){
if(c.num[i]>=10){
c.num[i+1]+=c.num[i]/10;
c.num[i]%=10;
}
}
return c;
}
inline int_n subtraction(int_n a,int_n b){
int_n c;
for(int i=0;i<c.num.size();i++){
c.num[i]=a.num[i]-b.num[i];
}
for(int i=0;i<c.num.size();i++){
if(c.num[i]<0){
c.num[i+1]--;
if(i==c.num.size()-1){
c.num[i+1]=0;
c.num[i]=std::abs(c.num[i]);
break;
}
c.num[i]+=10;
}
}
return c;
}
inline int_n multiplication(int_n a, int_n b){
int_n c;
fill(c.num.begin(),c.num.end(),0);
for(int i=0;i<a.size();i++){
int x=0;
for(int j=0;j<b.size();j++){
c.num[i+j]+=a.num[i]*b.num[j]+x;
x=c.num[i+j]/10;
c.num[i+j]%=10;
}
c.num[i+b.size()]+=x;
}
return c;
}
inline int_n division(int_n a,int_n b){
int_n c;
int_n re;
for (int i=a.num.size()-1;i>=0;i--) {
re*=make_int_n(10);
re+=make_int_n(a.num[i]);
int l=0,r=10,mid;
while(l<r) {
mid=(l+r)/2;
int_n t;
t=b*make_int_n(mid);
if(t<=re){
l=mid+1;
}else{
r=mid;
}
}
c.num[i]=l-1;
re-=b*make_int_n(c.num[i]);
}
return c;
}
inline int_n delivery(int_n a,int_n b){
int_n c;
int_n re;
for (int i=a.num.size()-1;i>=0;i--) {
re*=make_int_n(10);
re+=make_int_n(a.num[i]);
int l=0,r=10,mid;
while(l<r) {
mid=(l+r)/2;
int_n t;
t=b*make_int_n(mid);
if(t<=re){
l=mid+1;
}else{
r=mid;
}
}
c.num[i]=l-1;
re-=b*make_int_n(c.num[i]);
}
return re;
}
template<typename T>
inline int_n make_int_n(T x){
T _x=x;
int s=0;
while(_x){
s++;
_x/=10;
}
int_n ans;
if(x<0){
x=std::abs(x);
ans.negative=1;
}
for(int i=0;i<s;i++){
ans.num[i]=x%10;
x/=10;
}
return ans;
}
istream& operator>>(istream &cin,int_n &x){
x.read(cin);
return cin;
}
ostream& operator<<(ostream &cout,int_n x){
x.write(cout);
return cout;
}
ifstream& operator>>(ifstream &fin,int_n &x){
x.fread(fin);
return fin;
}
ofstream& operator<<(ofstream &fout,int_n &x){
x.fwrite(fout);
return fout;
}
bool operator==(int_n a,int_n b){
if(a.size()!=b.size()||a.negative!=b.negative){
return 0;
}
for(int i=a.size()-1;i>=0;i--){
if(a.num[i]!=b.num[i]){
return 0;
}
}
return 1;
}
bool operator!=(int_n a,int_n b){
return !(a==b);
}
bool operator>(int_n a,int_n b){
if(a.negative==0&&b.negative==1){
return 1;
}else if(a.negative==1&&b.negative==0){
return 0;
}
if(a.negative==b.negative&&a.negative==1){
if(a.size()!=b.size()){
return a.size()<b.size();
}
for(int i=a.size()-1;i>=0;i--){
if(a.num[i]!=b.num[i]){
return a.num[i]<b.num[i];
}
}
return 0;
}else{
if(a.size()!=b.size()){
return a.size()>b.size();
}
for(int i=a.size()-1;i>=0;i--){
if(a.num[i]!=b.num[i]){
return a.num[i]>b.num[i];
}
}
return 0;
}
}
bool operator<(int_n a,int_n b){
if(a.negative==0&&b.negative==1){
return 0;
}else if(a.negative==1&&b.negative==0){
return 1;
}
if(a.negative==b.negative&&a.negative==1){
if(a.size()!=b.size()){
return a.size()>b.size();
}
for(int i=a.size()-1;i>=0;i--){
if(a.num[i]!=b.num[i]){
return a.num[i]>b.num[i];
}
}
return 0;
}else{
if(a.size()!=b.size()){
return a.size()<b.size();
}
for(int i=a.size()-1;i>=0;i--){
if(a.num[i]!=b.num[i]){
return a.num[i]<b.num[i];
}
}
return 0;
}
}
bool operator>=(int_n a,int_n b){
return a>b||a==b;
}
bool operator<=(int_n a,int_n b){
return a<b||a==b;
}
int_n operator-(int_n a){
a.negative=!a.negative;
return a;
}
int_n &operator+=(int_n &a,int_n b){
a=a+b;
return a;
}
int_n &operator-=(int_n &a,int_n b){
a=a-b;
return a;
}
int_n &operator*=(int_n &a,int_n b){
a=a*b;
return a;
}
int_n &operator/=(int_n &a,int_n b){
a=a/b;
return a;
}
int_n &operator%=(int_n &a,int_n b){
a=a%b;
return a;
}
// inline void swap(int_n &a,int_n &b){
// int_n temp(std::max(MIN_SIZE,max(a.max_size,b.max_size)));
// temp=a;
// a=b;
// b=temp;
// }
// inline int_n max(int_n a,int_n b){
// return (a>=b?a:b);
// }
// inline int_n min(int_n a,int_n b){
// return (a<=b?a:b);
// }
}
# endif