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

来源:互联网 发布:数据库外模式 编辑:程序博客网 时间:2024/05/20 22:30

代码:

//题目描述////应用中需要解决大数运算问题。请设计符号大数类,能支持大数+、-运算和输出。假定本题大数在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的高位数给删除。

0 0
原创粉丝点击