【C++版本】大整数bign的建立与运算

# include <iostream>
# include <string>

using namespace std;


struct bign
{
    int d[1000];
    int len;

    bign() : d{0}, len(0){} // // memset(d, 0, sizeof(d));
    bign(string num): bign(){
        this->len = num.size();
        // 逆着赋值,方便在运算时从低位到高位运算i可以从0开始
        for(int i=0;i<num.size();++i)
            this->d[i] = num[this->len-1 - i] - '0';
    }

    void showArr() const{
        for(int i=0;i<len;++i){
            cout << d[i] << " ";
        }cout << endl;
    }

    void show()const{
    for(int i=len-1;i>=0;i--){
            cout << d[i];
        }cout << endl;
    }

    bool operator<(const bign & rhs){
        if(this->len < rhs.len)
           return true;
        else 
        if(this->len > rhs.len)
            return false;
        else
            for(int i = len-1; i >= 0 ; i--){
                if(this->d[i] < rhs.d[i])
                    return true;
                else
                if(this->d[i] > rhs.d[i])
                    return false;
            }
        return false;
    }
    bool operator>(const bign & rhs){
        if(this->len < rhs.len)
           return false;
        else 
        if(this->len > rhs.len)
            return true;
        else
            for(int i = len-1; i >= 0 ; i--){
                if(this->d[i] < rhs.d[i])
                    return false;
                else
                if(this->d[i] > rhs.d[i])
                    return true;
            }
        return false;
    }
    bool operator==(const bign & rhs){
        if(this->len == rhs.len){
            for(int i = len-1; i >= 0 ; i--){
                if(this->d[i] != rhs.d[i])
                    return false;
            }
        }
        else
            return false;

        return true;
    }

    bign operator+(const bign & rhs){
        bign c;
        int carry = 0;

        // 以较长的数字为长度为界限,因为初始化没有数字的位置都为0,
        // 所以在短的运算完后,对长的后面的部分也只是+0-0之类的也无影响
        for(int i=0;i<this->len || i<rhs.len;++i){
            int temp = this->d[i] + rhs.d[i] + carry;  // 每一位和进位相加
            c.d[c.len++]  = temp % 10;                 // 对两数当前位相加的结果取余就是c当前位的结果
            carry = temp / 10;                         // 对两数当前位相加的结取十位就是进位
        }

        // 如果最后得到的进位不为0,那么最高位就是进位
        if(carry != 0)
            c.d[c.len++] = carry;

        return c;
    }

    bign operator-(const bign & rhs){
        bign c;

        // 以较长的数字为长度为界限,因为初始化没有数字的位置都为0,
        // 所以在短的运算完后,对长的后面的部分也只是+0-0之类的也无影响
        for(int i=0;i<this->len || i<rhs.len;++i){
            if(this->d[i] < rhs.d[i]){  // 不过当前位不够减,就需要向高位借位
                this->d[i+1]--;   // 高位被借位
                this->d[i] += 10; // 当前为将借到的位加上
            }
            c.d[c.len++] = this->d[i] - rhs.d[i];  // 两数当前位相减就是c当前位的结果
        }

        // 如果最后两个最高位相等相减后为0,就需要将这个0去掉,长度也要-1
        // c.len > 1是为了防止两数相减等于0,导致len=0从而得到错误的结果(len至少为1)
        while(c.len > 1 && c.d[c.len - 1] == 0)
            c.len--;

        return c;
    }
    bign operator*(int rhs){
        bign c;
        int carry = 0;

        for(int i=0;i<this->len;++i){
            int temp = this->d[i] * rhs + carry;  
            c.d[c.len++]  = temp % 10;                 
            carry = temp / 10;   
        /* 经试验,不用temp也可以
            carry = this->d[i] * rhs + carry;  
            c.d[c.len++]  = carry % 10;                 
            carry /= 10;    
        */                      
        }

        // 处理最后一个进位
        while(carry != 0){
            c.d[c.len++] = carry % 10;
            carry /= 10;
        }

        return c;
    }

    pair<bign, int> operator/(int rhs){
        bign c;
        int r = 0;  // 余数
        c.len = this->len;
        for(int i = this->len - 1; i >= 0 ;i--){  // 从高位开始
            r = r*10 + this->d[i];
            if(r < rhs)  // 不够除,该位为0
                c.d[i] = 0;
            else{        // 够除
                c.d[i] = r / rhs; 
                r = r % rhs;
            }
        }

        // 去除0
        while(c.len > 1 && c.d[c.len - 1] == 0)
            c.len--;


        return {c, r};
    }
};



int main()
{
    string strnum1, strnum2;
    cin >> strnum1 >> strnum2;

    bign a(strnum1), b(strnum2);
    bign c;
    
    c = a+b;
    c.show();
    cout << endl;

    c = a-b;
    c.show();
    cout << endl;

    c = a * 35;
    c.show();
    cout << endl;

    auto cc = a / 7;
    cc.first.show();
    cout << cc.second;





    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值