草海桐 2023-06-05 22:09 采纳率: 100%
浏览 40
已结题

大整数 运算符 重载 不能 long long int

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

1)带参构造函数,为字符指针动态分配1001个字符空间。根据参数初始化大整数。

  1. 无参构造函数,为字符指针动态分配1001个字符空间。

3)重载运算符+,实现两个大整数的加法。

4)重载运算符-,实现两个大整数的减法。

5)重载运算符*,实现两个大整数的乘法。

6)重载输入,输入大整数。

7)重载输出,输出大整数。

8)析构函数,释放分配的空间。该函数不可屏蔽。

主函数输入大整数,完成大整数的加、减、乘。主函数代码如下,不可修改。

输入

测试次数

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

输出

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

img

img

  • 写回答

2条回答 默认 最新

  • 草海桐 2023-06-07 21:54
    关注
    
    #include <iostream>
    #include <cstring>
    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;tt<len1;tt++)
                temp1.p[tt-1]=temp1.p[tt];
            temp1.p[len1-1]='\0';
            for(int tt=1;tt<len2;tt++)
                temp2.p[tt-1]=temp2.p[tt];
            temp2.p[len2-1]='\0';
        }
        else if(*this->p!='-' && *r.p=='-')//正+负
        {
            for(int tt=1;tt<len2;tt++)
                temp2.p[tt-1]=temp2.p[tt];
            temp2.p[len2-1]='\0';
            return temp1-temp2;
        }
        else if(*this->p=='-' && *r.p!='-')//负+正
        {
            for(int tt=1;tt<len1;tt++)
                temp1.p[tt-1]=temp1.p[tt];
            temp1.p[len1-1]='\0';
            return temp2-temp1;
        }
    
        len1=strlen(temp1.p),len2=strlen(temp2.p);
        int len3=max(len1,len2),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--)
        {
            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;tt<len1;tt++)
                temp1.p[tt-1]=temp1.p[tt];
            temp1.p[len1-1]='\0';
            for(int tt=1;tt<len2;tt++)
                temp2.p[tt-1]=temp2.p[tt];
            temp2.p[len2-1]='\0';
            return temp2-temp1;//转成正数-正数
        }
        else if(*this->p!='-' && *r.p=='-')//正数-负数
        {
            for(int tt=1;tt<len2;tt++)
                temp2.p[tt-1]=temp2.p[tt];
            temp2.p[len2-1]='\0';
            return temp1+temp2;//转成正数+正数
        }
        else if(*this->p=='-' && *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<len3;ii++)
                res.p[ii]=res.p[ii+1];
            len3=strlen(res.p);
        }
    
        if(sign=='-')
        {
            for(int tt=len3;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);
    
        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;tt<len1;tt++)
                temp1.p[tt-1]=temp1.p[tt];
            temp1.p[len1-1]='\0';
            for(int tt=1;tt<len2;tt++)
                temp2.p[tt-1]=temp2.p[tt];
            temp2.p[len2-1]='\0';
            len1=strlen(temp1.p),len2=strlen(temp2.p);
        }
        else if(*this->p!='-' && *r.p!='-')//正数*正数
            sign='+';
        else if(*this->p=='-' && *r.p!='-') //负数*正数
        {
            sign='-';
            for(int tt=1;tt<len1;tt++)
                temp1.p[tt-1]=temp1.p[tt];
            temp1.p[len1-1]='\0';
            len1=strlen(temp1.p);
        }
        else if(*this->p!='-' && *r.p=='-')//正数*负数
        {
            sign='-';
            for(int tt=1;tt<len2;tt++)
                temp2.p[tt-1]=temp2.p[tt];
            temp2.p[len2-1]='\0';
            len2=strlen(temp2.p);
        }
    
        int len3=len1+len2;
        for(int tt=0;tt<len3;tt++)
            res.p[tt]='0';
        res.p[len3]='\0';
        CBigInteger array[len2];
        for(int i=len1-1;i>=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<len3;ii++)
                res.p[ii]=res.p[ii+1];
            len3=strlen(res.p);
        }
    
        if(sign=='-')
        {
            for(int tt=len3;tt>=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<<'('<<r.p<<')';
        else
            out<<r.p;
        return out;
    }
    
    //只进行两个正数比较
    bool CBigInteger::operator>=(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]<r.p[i])
                    return false;
                else
                    continue;
            return true;
        }
        return false;
    }
    
    
    int main()
    {
        int t;
        char op;
        CBigInteger bigNum1;
        CBigInteger bigNum2;
    
        cin>>t;
        while (t--)
        {
            cin>>bigNum1>>op>>bigNum2;
            cout<<bigNum1<<" "<<op<<" "<<bigNum2<<" = ";
            if(op=='+')
                cout<<bigNum1+bigNum2<<endl;
            else if(op=='-')
                cout<<bigNum1-bigNum2<<endl;
            else if(op=='*')
                cout<<bigNum1*bigNum2<<endl;
        }
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月15日
  • 已采纳回答 12月7日
  • 创建了问题 6月5日