高精度封装

· · 科技·工程

自己写的高精度封装

目前正在开发 & 调试中,如果有发现 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