21天学通C++之大数加减法类的设计

代码:

//题目描述
//
//应用中需要解决大数运算问题。请设计符号大数类,能支持大数+、-运算和输出。假定本题大数在200位以内。
//
//输入描述
//
//输入两行分别为两个无符号大数
//
//(第一个大数不小于第二个大数)
//
//输出描述
//
//输出它们的和、差
//
//输入样例
//
//1234567890987654321333888999666
// 147655765659657669789687967867
//
//输出样例
//
//1382223656647311991123576967533
//1086912125327996651544201031799

#include<string.h>
#include<iostream>
using namespace std;

class BigNum{
private:
    char num[200];
    int length;
public:
    BigNum();
    BigNum(const char* rpl);
    BigNum(const BigNum &rpl);
    const char* GetNum() const;
    int GetLength() const;
    void SetNum(const char *rpl);
    void SetLength(const int length);
    BigNum GetSum(const BigNum &b);
    BigNum GetMinus(const BigNum &b);
    BigNum& operator=(const char* rpl);
    BigNum& operator=(const BigNum &rpl);
    void Print();
    ~BigNum();
};

BigNum::BigNum(){
    length=0;
}

BigNum::BigNum(const char* rpl){
    strcpy(this->num,rpl);
    this->length=strlen(this->num);
}

BigNum::BigNum(const BigNum &rpl){
    strcpy(this->num,rpl.GetNum());
    this->length=rpl.GetLength();
}

const char* BigNum::GetNum() const{
    return this->num;
}

int BigNum::GetLength() const{
    return this->length;
}

void BigNum::SetNum(const char* rpl){
    strcpy(this->num,rpl);
}

void BigNum::SetLength(const int length){
    this->length=length;
}

BigNum BigNum::GetSum(const BigNum &b){
    BigNum c;
    char ans[200];
    char s;
    int i,j,k,flag;
    i=0,j=0,flag=0;
    while(i<this->length&&j<b.GetLength()){
        if(this->num[this->length-i-1]-'0'+b.GetNum()[b.GetLength()-j-1]-'0'+flag>=10){
            ans[i]=this->num[this->length-i-1]-'0'+b.GetNum()[b.GetLength()-j-1]+flag-10;
            flag=1;
        }else{
            ans[i]=this->num[this->length-i-1]-'0'+b.GetNum()[b.GetLength()-j-1]+flag;
            flag=0;
        }
        i++;
        j++;
    }

    while(i<this->length){
        if(this->num[this->length-i-1]+flag-'0'>=10){
            ans[i]=this->num[this->length-i-1]+flag-10;
            flag=1;
        }else{
            ans[i]=this->num[this->length-i-1]+flag;
            flag=0;
        }
        i++;
    }

    if(flag==1){
        ans[i]=1+'0';
        i++;
    }

    for(k=0;k<i/2;k++){
        s=ans[i-k-1];
        ans[i-k-1]=ans[k];
        ans[k]=s;
    }
    c.SetNum(ans);
    c.SetLength(i);
    return c;
}

BigNum BigNum::GetMinus(const BigNum &b){
    BigNum c;
    char ans[200];
    char s;
    int i,j,k,flag;
    i=0,j=0,flag=0;
    while(i<this->length&&j<b.GetLength()){
        if(this->num[this->length-i-1]-b.GetNum()[b.GetLength()-j-1]-flag<0){
            ans[i]=10+this->num[this->length-i-1]-b.GetNum()[b.GetLength()-j-1]-flag+'0';
            flag=1;
        }else{
            ans[i]=this->num[this->length-i-1]-b.GetNum()[b.GetLength()-j-1]-flag+'0';
            flag=0;
        }
        i++;
        j++;
    }

    while(i<this->length){
        if(this->num[this->length-i-1]-flag-'0'<0){
            ans[i]=10+this->num[this->length-i-1]-flag;
            flag=1;
        }else{
            ans[i]=this->num[this->length-i-1]-flag;
            flag=0;
        }
        i++;
    }

    for(k=i-1;k>0;k--){
        if(ans[k]=='0'){
            i--;
            ans[k]='\0';
        }else{
            break;
        }
    }

    for(k=0;k<i/2;k++){
        s=ans[i-k-1];
        ans[i-k-1]=ans[k];
        ans[k]=s;
    }

    c.SetNum(ans);
    c.SetLength(i);
    return c;
}

BigNum& BigNum::operator=(const char* rpl){
    strcpy(this->num,rpl);
    this->length=strlen(rpl);
    return *this;
}

BigNum& BigNum::operator=(const BigNum &rpl){
    strcpy(this->num,rpl.GetNum());
    this->length=rpl.GetLength();
    return *this;
}

void BigNum::Print(){
    for(int i=0;i<this->length;i++){
        cout<<this->num[i];
    }
    cout<<endl;
}

BigNum::~BigNum(){
}

int main()
{
    BigNum a,b,c;
    char n[200];
    char m[200];
    while(cin>>n>>m){
        a=n;
        b=m;
        c=a.GetSum(b);
        c.Print();
        c=a.GetMinus(b);
        c.Print();
    }
}

算法注意要点:

在利用字符串表示大数进行大数计算的过程中,最主要是要注意字符串是字符类型而进行计算的”数”要用整数的方式来计算。所以在判断两个数同位相加的时候判定是否需要借位时要减合适数量的’0’才行,而将一位的结果赋值给结果字符串时需要保证这个结果是数字的相应的那个字符。
加法需要额外确定以下最后一位是否为1,减法需要额外将是0的高位数给删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值