训练日记2019.10.27 高精度运算模板 (补)

2019.10.27 星期日(补昨天)
昨天看了场codeforces div3, 好难啊,有道题刚在洛谷oj上见过然后就被照搬了,dfs找环,直接做深搜然后用数组记录就行了,顺便提一下,打算做点有建设性的,光自己练太慢了,跟着刘汝佳书啃吧,md,dp乃万物之源,自己做了套高精度运算的模板,走你!秋假结束了,我终于也只剩6场考试就可以结束这个该死的学期了,挺住。

struct bigInt{//练习一下大数加减乘除
    int num[128];//uint_128
    int cnt;
    bigInt():cnt(0){
        memset(num, 0 , sizeof(num));//初始化为0
    }
    bigInt(const string &number):cnt(number.length()){
        for(int i = cnt - 1 ; i >= 0; --i){
            num[cnt - 1 - i] = number[i] - '0';
        }
    }
    bigInt(ll number):cnt(0){
        while(number){
            num[cnt++] = number % 10;
            number /= 10;
        }
    }
    int length(){
        return cnt;
    }//记录长度
    bigInt operator+(bigInt rhs){
        int flag = 0;//进位标
        bigInt tmp;
        if(cnt > rhs.length()){
            //如果我方大
            int i;
            for(i = 0 ; i < rhs.length(); ++i){
                int sum = rhs.num[i] + num[i] + flag;
                if(sum >= 10)flag = 1;
                else flag = 0;
                tmp.num[tmp.cnt++] = sum % 10;
            }
            for(; i < cnt ; ++i){
                int sum = num[i] + flag;
                if(sum >= 10){
                    flag = 1;
                }else{
                    flag = 0;
                }
                tmp.num[tmp.cnt++] = sum % 10;
            }
            return tmp;
        }else{
            int i;
            for(i = 0 ; i < cnt; ++i){
                int sum = rhs.num[i] + num[i] + flag;
                if(sum >= 10)flag = 1;
                else flag = 0;
                tmp.num[tmp.cnt++] = sum % 10;
            }
            for(; i < rhs.cnt ; ++i){
                int sum = rhs.num[i] + flag;
                if(sum >= 10){
                    flag = 1;
                }else{
                    flag = 0;
                }
                tmp.num[tmp.cnt++] = sum % 10;
            }
            return tmp;
        }
    }
    void print(){
        for(int i = length() - 1 ; i >= 0 ; --i){
            printf("%d", num[i]);
        }
    }
    bool operator<(bigInt rhs){
        if(length() < rhs.length()){
            return true;
        }else if(length() > rhs.length()){
            return false;
        }else{
            for(int i = length() - 1; i >= 0 ; --i){
                if(num[i] < rhs.num[i]){
                    return true;
                }
                if(num[i] > rhs.num[i]){
                    return false;
                }
            }
            return false;
        }
    }
    bool operator==(bigInt &rhs){
        if(length() != rhs.length()){
            return false;
        }
        for(int i = 0 ; i < length() ; ++i){
            if(num[i] != rhs.num[i])return false;
        }
        return true;
    }
    bool operator>(bigInt rhs){
        return rhs < *this && !(rhs == *this);
    }
    bool operator!=(bigInt rhs){
        return !(*this == rhs);
    }
    int operator[](int i){
        return num[i];
    }
};

基本能用的功能都有了,我觉得乘除和减法也不常用就没写。

发布了69 篇原创文章 · 获赞 1 · 访问量 3038

猜你喜欢

转载自blog.csdn.net/Stagflation/article/details/102791549
今日推荐