大整数计算(运算符重载)

大整数计算(运算符重载)

题目描述

定义大整数类CBigInteger(假设最长支持1000位),数据成员为一个字符指针。成员函数或友元函数包括:

1)带参构造函数,为字符指针动态分配1001个字符空间。根据参数初始化大整数。
2) 无参构造函数,为字符指针动态分配1001个字符空间。
3)重载运算符+,实现两个大整数的加法。
4)重载运算符-,实现两个大整数的减法。
5)重载运算符*,实现两个大整数的乘法。6)重载输入,输入大整数。
7)重载输出,输出大整数。
8)析构函数,释放分配的空间。该函数不可屏蔽。
主函数输入大整数,完成大整数的加、减、乘。主函数代码如下,不可修改。

输入

测试次数

每组测试数据一行: 大整数1 运算符 大整数2

输出

对每组测试数据输出表达式和计算结果,具体格式见样例。

样例输入

3
100 * -100
-123456789 + 123456
0001 - -123

样例输出

100 * (-100) = (-10000)
(-123456789) + 123456 = (-123333333)
1 - (-123) = 124

备注

字符数组乘法参考
https://www.jianshu.com/p/8a4c0f5ed079
https://www.cnblogs.com/alderheart/p/10958615.html

#include 
#include 
using namespace std;

class CBigInteger
{
private:
    char *p;
public:
    CBigInteger(char *num);
    CBigInteger();
    CBigInteger(const CBigInteger &b);
    ~CBigInteger(){delete []p;}
    CBigInteger operator+(const CBigInteger &r);
    CBigInteger operator-(CBigInteger &r);
    CBigInteger operator*(CBigInteger &r);
    bool operator>=(CBigInteger &r);
    friend istream& operator>>(istream &in,CBigInteger &r);
    friend ostream& operator<<(ostream &out,CBigInteger r);

};

CBigInteger::CBigInteger(char *num) {
    p = new char[1001];
    strcpy(p,num);
}

CBigInteger::CBigInteger() {
    p = new char[1001];
}

CBigInteger::CBigInteger(const CBigInteger &b) {
    p = new char[1001];
    strcpy(p,b.p);
}

CBigInteger CBigInteger::operator+(const CBigInteger &r) {
    //正数+正数 或者 负数加负数
    CBigInteger res,temp1(this->p),temp2(r.p);
    char sign='+';
    int len1=strlen(temp1.p),len2=strlen(temp2.p);
    if(*this->p=='-' && *r.p=='-')
    {
        sign='-';
        for(int tt=1;ttp!='-' && *r.p=='-')//正+负
    {
        for(int tt=1;ttp=='-' && *r.p!='-')//负+正
    {
        for(int tt=1;tt=0&&j>=0;i--,j--,k--)
    {
        res.p[k]='0'+(temp1.p[i]+temp2.p[j]-2*'0')%10+flag;
        flag=(temp1.p[i]+temp2.p[j]-2*'0')/10;
        if(k==0 && flag!=0)//进位溢出,数组内每一个数都往后面挪移位
        {
            for(int tt=len3;tt>=0;tt--)
                res.p[tt+1]=res.p[tt];
            res.p[0]='0'+(temp1.p[i]+temp2.p[j]-2*'0')/10;
            len3++;
        }
    }
    while (i>=0)
    {
        res.p[k]='0'+(temp1.p[i]-'0'+flag)%10;
        flag=(temp1.p[i]-'0'+flag)/10;
        if(k==0 && flag!=0)
        {
            for(int tt=len3;tt>0;tt--)
                res.p[tt+1]=res.p[tt];
            res.p[0]='0'+(temp1.p[i]-'0'+flag)/10;
            len3++;
        }
        i--,k--;
    }
    while (j>=0)
    {
        res.p[k]='0'+(temp2.p[j]-'0'+flag)%10;
        flag=(temp2.p[j]-'0'+flag)/10;
        if(k==0 && flag!=0)
        {
            for(int tt=len3;tt>0;tt--)
                res.p[tt+1]=res.p[tt];
            res.p[0]='0'+(temp2.p[j]-'0'+flag)/10;
        }
        j--,k--;
    }

    if(sign=='-')
    {
        for(int tt=len3-1;tt>=0;tt--)
            res.p[tt+1] = res.p[tt];
        res.p[0]=sign;
    }

    return res;
}

CBigInteger CBigInteger::operator-(CBigInteger &r) {
    CBigInteger res,temp1(this->p),temp2(r.p);
    char sign='+';
    int len1=strlen(temp1.p),len2=strlen(temp2.p),len3=0;
    if(*this->p!='-' && *r.p!='-')//正数-正数
    {
        if(temp1>=temp2)
            sign='+';
        else
            sign='-';
        len1=strlen(temp1.p),len2=strlen(temp2.p);
        len3=max(len1,len2);
        int flag=0;//借位标志
        for(int tt=0;tt<=len3;tt++)
            res.p[tt]='\0';
        int i,j,k;
        for(i=len1-1,j=len2-1,k=len3-1;i>=0&&j>=0;i--,j--,k--)
        {
            if(sign=='+')
            {
                if(temp1.p[i]-temp2.p[j]-flag>=0)
                    res.p[k]=temp1.p[i]-temp2.p[j]+'0'-flag;
                else
                {
                    res.p[k]=temp1.p[i]+10-temp2.p[j]+'0'-flag;
                    flag=1;
                }
            }
            else if(sign=='-')
            {
                if(temp2.p[j]-temp1.p[i]-flag>=0)
                    res.p[k]=temp2.p[j]-temp1.p[i]+'0'-flag;
                else
                {
                    res.p[k]=temp2.p[j]+10-temp1.p[i]+'0'-flag;
                    flag=1;
                }
            }
        }
        while (i>=0)
        {
            if(temp1.p[i]-flag>=0)
                res.p[k]=temp1.p[i]-flag;
            else
            {
                res.p[k]=temp1.p[i]+10-flag;
                flag=1;
            }
            i--,k--;
        }
        while (j>=0)
        {
            if(temp2.p[j]-flag>=0)
                res.p[k]=temp2.p[j]-flag;
            else
            {
                res.p[k]=temp2.p[j]+10-flag;
                flag=1;
            }
            j--,k--;
        }
    }
    else if(*this->p=='-' && *r.p=='-')//负数-负数
    {
        for(int tt=1;ttp!='-' && *r.p=='-')//正数-负数
    {
        for(int tt=1;ttp=='-' && *r.p!='-')//负数-正数
    {
        for(int tt=len2;tt>=0;tt--)
            temp2.p[tt+1]=temp2.p[tt];
        temp2.p[0]='-';
        return temp1+temp2;//转成负数+负数
    }

    //避免出现了100-99=001这种情况
    while (res.p[0]=='0' && len3!=1)
    {
        for(int ii=0;ii=0;tt--)
            res.p[tt+1] = res.p[tt];
        res.p[0]=sign;
    }
    return res;
}

CBigInteger CBigInteger::operator*(CBigInteger &r) {
    CBigInteger res,temp1(this->p),temp2(r.p);
    char sign='+';
    int len1=strlen(temp1.p),len2=strlen(temp2.p);

    if(this->p[0]=='0' || r.p[0]=='0')
    {
        res.p[0]='0';
        res.p[1]='\0';
        return res;
    }

    if(*this->p=='-' && *r.p=='-')//负数*负数
    {
        sign='+';
        for(int tt=1;ttp!='-' && *r.p!='-')//正数*正数
        sign='+';
    else if(*this->p=='-' && *r.p!='-') //负数*正数
    {
        sign='-';
        for(int tt=1;ttp!='-' && *r.p=='-')//正数*负数
    {
        sign='-';
        for(int tt=1;tt=0;i--) {
        int step = 0;
        for (int j = len2 - 1; j >= 0; j--) {
            int mul = (temp1.p[i] - '0') * (temp2.p[j] - '0');
            int sum = res.p[i + j + 1] - '0' + step + mul % 10;
            res.p[i + j + 1] = sum % 10 + '0';
            step = sum / 10 + mul / 10;
        }
        res.p[i] += step;
    }

    while (res.p[0]=='0' && len3!=1)
    {
        for(int ii=0;ii=0;tt--)
            res.p[tt+1] = res.p[tt];
        res.p[0]=sign;
    }
    return res;
}

istream &operator>>(istream &in, CBigInteger &r) {
    char temp[1001];
    in>>temp;
    int i=0;
    if(temp[0]=='0' && temp[1]!='\0')//判断输入是0还是0001这种
        for(i=0;temp[i]=='0';i++);
    strcpy(r.p,temp+i);
    return in;
}

ostream &operator<<(ostream &out, CBigInteger r) {
    if(r.p[0]=='-')
        out<<'('<=(CBigInteger &r) {
    if(strlen(p)>strlen(r.p))
        return true;
    if(strlen(p)==strlen(r.p))
    {
        for(int i=0;i<(int)strlen(p);i++)
            if(p[i]>r.p[i])
                return true;
            else if(p[i]>t;
    while (t--)
    {
        cin>>bigNum1>>op>>bigNum2;
        cout<