C++ 大整数运算+-*(运算符重载)

定义大整数,重载*+-,并进行运算。

-00 -0 -002 002 00 0 999999999999999999999999999999999 等情况都有考虑到c1f1a140e4404877a3f19806759df26e.png

#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+1;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],*s=new char[1001];
    in>>temp;
    int i=0,a;
    if(temp[0]=='0' && temp[1]!='\0')//判断输入是0还是0001这种
    {
    	for(i=0;temp[i]=='0';i++);
    	if(temp[i]=='\0')
    	strcpy(r.p,"0");else
        strcpy(r.p,temp+i);
	}else 
	if(temp[0]=='-' && temp[1]=='0'&& temp[2]!='\0'){
	s[0]='-';		
		for(i=1;temp[i]=='0';i++);
		if(temp[i]=='\0')
    	strcpy(r.p,"0");else{  		
		for(a=i;a<=strlen(temp);a++)		
		s[a-i+1]=temp[a];
        strcpy(r.p,s);
		}
	}else  if(temp[0]=='-' && temp[1]=='0'&& temp[2]=='\0')
	           strcpy(r.p,"0");
	else 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草海桐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值