答案:#include<iostream>
using namespace std;
class integer
{
protected:
char num[2000];
int len;
public:
integer(integer &i);
integer(){};
bool isNegative();//判断是否为负数,若是负数则返回true
void remove();//消去负号
void add();//增加负号
void reduce(long n);
friend integer& operator*(integer &i1,integer &i2);
friend integer& operator+(integer &i1,integer &i2);
friend integer& operator-(integer &i1,integer &i2);
friend integer& operator>>(istream &input,integer &i);
friend ostream& operator<<(ostream &output,integer &i);
};
integer::integer(integer &i)
{
for(int j=0;j<i.len;j++)
num[j]=i.num[j];
len=i.len;
}
void integer::add()
{
for(int i=len;i>=0;i--)
num[i]=num[i-1];
num[0]='-';
len++;
}
void integer::remove()
{
for(int i=0;i<len-1;i++)
num[i]=num[i+1];
len--;
}
bool integer::isNegative()
{
if(num[0]=='-') return true;
else return false;
}
integer& operator-(integer &i1,integer &i2)
{
integer s;
integer u;
u=i1;
int c[2002]={0},i,j;
int len1,len2,t=0,temp,count=0,num=0;
if(!i1.isNegative()&&i2.isNegative())
{
i2.remove();
s=i1+i2;
i2.add();
return s;
}
else if(i1.isNegative()&&!i2.isNegative())
{
i2.add();
s=i1+i2;
i2.remove();
return s;
}
else if(i1.isNegative()&&i2.isNegative())
{
i2.remove();
s=i1+i2;
i2.add();
return s;
}
len1=u.len;
len2=i2.len;
if(len1>len2 ||(len1==len2&&strcmp(u.num,i2.num)>0))
{
for(i=len1-1,j=len2-1;i>=0||j>=0;i--,j--)
{
if(i>=0 && j>=0)
temp=(int(u.num[i]-48)-int(i2.num[j]-48));
else if(i>=0&&j<0)
temp=int(u.num[i]-48);
else if(i<0 &&j>=0)
temp=int(i2.num[j]-48);
if(temp<0)
{
c[t]=c[t]+(temp+10);
u.num[i-1]=u.num[i-1]-1;
}
else c[t]=c[t]+temp;
t++;
}
}
else if(len1<len2 ||(len1==len2&&strcmp(i1.num,i2.num)<0) )
{
s.num[count++]='-';
for(i=len2-1,j=len1-1;i>=0||j>=0;i--,j--)
{
if(i>=0 && j>=0)
temp=(int(i2.num[i]-48)-int(i1.num[j]-48));
else if(i>=0&&j<0)
temp=int(i2.num[i]-48);
else if(i<0 &&j>=0)
temp=int(i1.num[j]-48);
if(temp<0)
{
c[t]=c[t]+(temp+10);
i2.num[i-1]=i2.num[i-1]-1;
}
else c[t]=c[t]+temp;
t++;
}
}
for(i=t;i>=0;i--)
{
if(c[i]==0 &&i!=0 && num==0)
continue;
num=1;
s.num[count++]=char(c[i]+48);
}
s.len=count;
return s;
}
integer& operator*(integer &i1,integer &i2)
{
integer s;
int c[2002]={0},i,j;
int t=0,temp,count=0,num=0;
if(i1.isNegative()&&!i2.isNegative())
s.num[count++]='-';
else if(!i1.isNegative()&&i2.isNegative())
s.num[count++]='-';
for(i=i2.len-1;i>=0&&i2.num[i]!='-';i--)
{
t=i2.len-1-i;
for(j=i1.len-1;j>=0&&i1.num[j]!='-';j--)
{
temp=(int(i2.num[i]-48)*int(i1.num[j]-48));
c[t]=c[t]+temp;
if(c[t]>=10)
{
c[t+1]=c[t+1]+(c[t]/10);
c[t]=c[t]%10;
}
t++;
}
}
for(i=t;i>=0;i--)
{
if(c[i]==0 &&i!=0 && num==0)
continue;
num=1;
s.num[count++]=char(c[i]+48);
}
s.len=count;
return s;
}
integer& operator+(integer &i1,integer &i2)
{
integer s;
int c[2002]={0},i,j,flag=0;
int len1,len2,t=0,temp,count=0,num=0;
if(i1.isNegative()&&!i2.isNegative())
{
i1.remove();
s=i2-i1;
i1.add();
return s;
}
else if(!i1.isNegative()&&i2.isNegative())
{
i2.remove();
s=i1-i2;
i2.add();
return s;
}
else if(i1.isNegative()&&i2.isNegative())
{
i1.remove();
i2.remove();
s.num[count++]='-';
flag=1;
}
len1=i1.len;
len2=i2.len;
for(i=len1-1,j=len2-1;i>=0||j>=0;i--,j--)
{
if(i>=0 && j>=0)
temp=(int(i1.num[i]-48)+int(i2.num[j]-48));
else if(i>=0&&j<0)
temp=int(i1.num[i]-48);
else if(i<0 &&j>=0)
temp=int(i2.num[j]-48);
c[t]=c[t]+temp;
if(c[t]>=10)
{
c[t+1]=c[t+1]+(c[t]/10);
c[t]=c[t]%10;
}
t++;
}
for(i=t;i>=0;i--)
{
if(c[i]==0 &&i!=0 && num==0)
continue;
num=1;
s.num[count++]=char(c[i]+48);
}
if(flag)
{
i1.add();
i2.add();
flag=0;
}
s.len=count;
return s;
}
integer& operator>>(istream &input,integer &i)
{
gets(i.num);
i.len=strlen(i.num);
return i;
}
ostream& operator<<(ostream &output,integer &i)
{
for(int j=0;j<i.len||i.num[j]=='-';j++)
{
if(i.num[j]=='-'&&i.num[j+1]=='0') continue;
output<<i.num[j];
}
return output;
}
void integer::reduce(long n)
{
long t=n;
int count1=0,count2=0;
int c[1000];
while(t)
{
c[count1++]=t%10;
t=t/10;
}
for(int i=count1-1;i>=0;i--)
&nbs
上一个:C++的发展历史
下一个:C++找字符串直接后继