定义大整数类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<