定义大整数,重载*+-,并进行运算。
-00 -0 -002 002 00 0 999999999999999999999999999999999 等情况都有考虑到
#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;
}