#include "HugeInt_head.h"
using namespace std;
void change_to_str(long int a,char str[])//将长整型转换成字符串
{
int i,j;
int y=1; //用于标记长整型的正负(当a=0时无意义)
long int b=a;
if(a<0)
{
a=-a;
y=0;
}
for(i=0;a>0;i++)
{
str[i]=a%10+48;
a=a/10;
}
str[i]='\0';
i--;
for(j=0;j<i-j;j++)
{
char temp=str[j];
str[j]=str[i-j];
str[i-j]=temp;
}
if(y==0) //a为负数情况下str右移补'-'号
{
for(int i=14;i>0;i--)//str长度为15
{
str[i]=str[i-1];
}
str[0]='-';
}
if(b==0)
{
str[0]='0';
str[1]='\0';
}
}
HugeInt::HugeInt (long int a)
{
char str[15]={0};
str[1]='\0';//使str默认对应巨型整数为0
change_to_str(a,str);
length=strlen(str);
n=new char [length+2];
strcpy(n,str);
}
HugeInt::HugeInt (const char *str)
{
length=strlen(str);
n=new char [length+2];
strcpy(n,str);
}
HugeInt::HugeInt (HugeInt &m)
{
length=m.length;
n=new char [length+2];
strcpy(n,m.n);
}
HugeInt::HugeInt ()//巨型整数默认构造为0
{
length=1;
n=new char [length+2];
n[0]='0';
n[1]='\0';
}
HugeInt::~HugeInt()
{
delete []n;
}
void HugeInt::ShowNum () //显示该巨型整数
{
cout<<n<<endl;
}
ostream &operator<<(ostream &out,const HugeInt &m)
{
return out;
}
HugeInt &HugeInt::operator=(const HugeInt &m)//重载(巨型整数)=(巨型整数)
{
if(this!=&m)
{
delete[]n;
length=m.length;
n=new char [length+2];
strcpy(n,m.n);
}
return *this;
}
HugeInt &HugeInt::operator=(long int a)//重载(巨型整数)=(长整型)
{
delete[]n;
char str[15];
change_to_str(a,str);
length=strlen(str);
n=new char [length+2];
strcpy(n,str);
return *this;
}
HugeInt &HugeInt::operator=(char *str)//重载(巨型整数)=(字符串)
{
delete[] n;
length=strlen(str);
n=new char [length+2];
strcpy(n,str);
return *this;
}
bool HugeInt::operator==(const HugeInt &m)//重载(巨型整数)== (巨型整数)
{
if (strcmp(n,m.n)==0)
return true;
else
return false;
}
bool HugeInt::operator!=(const HugeInt &m)//重载(巨型整数)!= (巨型整数)
{
if (strcmp(n,m.n)==0)
return false;
else
return true;
}
bool HugeInt::operator==(const long int a)//重载(巨型整数)== (长整型)
{
char str[15];
change_to_str(a,str);
if (strcmp(n,str)==0)
return true;
else
return false;
}
bool HugeInt::operator!=(const long int a)//重载(巨型整数)!= (长整型)
{
if(*this==a)
return false;
else
return true;
}
bool operator==(const long int a,HugeInt &m)//重载(长整型)==(巨型整数)
{
char str[15];
change_to_str(a,str);
if (strcmp(str,m.n)==0)
return true;
else
return false;
}
bool operator!=(const long int a,HugeInt &m)//重载(长整型)!= (巨型整数)
{
if(a==m)
return false;
else
return true;
}
bool HugeInt::operator <(const HugeInt &m)//重载(巨型整数)<(巨型整数)
{
if(n[0]=='-'&&m.n[0]!='-')
return true;
if(n[0]!='-'&&m.n[0]=='-')
return false;
if(n[0]!='-'&&m.n[0]!='-')
{
if(length<m.length)
return true;
if(length>m.length)
{
return false;
}
if(length==m.length)
{
if(strcmp(n,m.n)<0)
return true;
else
return false;
}
}
if(n[0]=='-'&&m.n[0]=='-')
{
if(length>m.length)
return true;
if(length<m.length)
{
return false;
}
if(length==m.length)
{
if(strcmp(n,m.n)>0)
return true;
else
return false;
}
}
}
bool HugeInt::operator <(const long int a)//重载(巨型整数)<(长整型)
{
char str[15];
change_to_str(a,str);
HugeInt m;
m=str;
if(*this<m)
return true;
else
return false;
}
bool operator <(const long int a,HugeInt &m1)//重载(长整型)<(巨型整数)
{
char str[15];
change_to_str(a,str);
HugeInt m2;
m2=str;
if(m2<m1)
return true;
else
return false;
}
bool HugeInt::operator<=(const HugeInt &m)//重载(巨型整数)<=(巨型整数)
{
if(*this<m||*this==m)
return true;
else
return false;
}
bool HugeInt::operator<=(const long int a)//重载(巨型整数)<=(长整型)
{
if(*this<a||*this==a)
return true;
else
return false;
}
bool operator<=(const long int a,HugeInt &m)//重载(长整型)<=(巨型整数)
{
if(a<m||a==m)
return true;
else
return false;
}
bool HugeInt::operator >(const HugeInt &m)//重载(巨型整数)>(巨型整数)
{
if(*this<=m)
return false;
else
return true;
}
bool HugeInt::operator >(const long int a)//重载(巨型整数)>(长整型)
{
if(*this<=a)
return false;
else
return true;
}
bool operator >(const long int a, HugeInt &m)//重载(长整型)>(巨型整数)
{
if(a<=m)
return false;
else
return true;
}
bool HugeInt::operator>=(const HugeInt &m)//重载(巨型整数)>=(巨型整数)
{
if(*this<m)
return false;
else
return true;
}
bool HugeInt::operator>=(const long int a)//重载(巨型整数)>=(长整型)
{
if(*this<a)
return false;
else
return true;
}
bool operator>=(const long int a,HugeInt &m)//重载(长整型)>=(巨型整数)
{
if(a<m)
return false;
else
return true;
}
HugeInt HugeInt::operator+(const HugeInt &m)//重载(巨型整数)+(巨型整数)
{
if(n[0]!='-'&&m.n[0]!='-')
{
HugeInt Max;
HugeInt sb_Min,Min;
HugeInt Sum;
Max=(*this>m)? *this:m;
sb_Min=(*this<=m)? *this:m;
Min.length=Max.length;
delete []Min.n;
Min.n=new char[Min.length+2];
strcpy(Min.n,sb_Min.n);
Sum.length=Max.length+1;//多出一位用于进位
delete []Sum.n;
Sum.n=new char [Sum.length+2];
Sum.n[Max.length]='\0';//把Sum末尾和Max对齐
for(int i=0;i<Min.length-sb_Min.length;i++)//把Min的末位和Max对齐
{
int j;
for(j=Min.length;j>0;j--)
{
Min.n[j]=Min.n[j-1];
}
Min.n[j]='0';
}
/////////////////下面开始相加
int carry=0;//进位标志
for( i=Max.length-1;i>=0;i--)
{
Sum.n[i]=Max.n[i]+Min.n[i]+carry-48;
if(Sum.n[i]>'9')
{
Sum.n[i]-=10;
carry=1;
}
else
carry=0;
}
if(carry==1)//把Sum右移并给首字符补'1'
{
int j;
for(j=Sum.length;j>0;j--)
{
Sum.n[j]=Sum.n[j-1];
}
Sum.n[j]='1';
}
else Sum.length--;
return Sum;
}
if(n[0]=='-'&&m.n[0]!='-')
{
HugeInt n1;
n1=*this;
for(int j=0;j<n1.length;j++)//全体左移(把'-'覆盖掉)
{
n1.n[j]=n1.n[j+1];
}
n1.length--;
HugeInt Max;
HugeInt sb_Min,Min;
HugeInt Sum;
Max=(n1>m)? n1:m;
sb_Min=(n1<=m)? n1:m;
Min.length=Max.length;
delete []Min.n;
Min.n=new char[Min.length+2];
strcpy(Min.n,sb_Min.n);
Sum.length=Max.length;
delete []Sum.n;
Sum.n=new char [Sum.length+2];//由于最后不知道Sum会不会有'-'号,多申请一位
Sum.n[Max.length]='\0';//把Sum末尾和Max对齐
for(int i=0;i<Min.length-sb_Min.length;i++)//把Min的末位和Max对齐
{
int j;
for(j=Min.length;j>0;j--)
{
Min.n[j]=Min.n[j-1];
}
Min.n[