在网上都没有看到支持负数的高精度模板,所以自己写了下。
如果有什么bug,请指出
struct bign
{
int z[2005];
int len;
bool ok;
bign()
{
memset(z,0,sizeof(z));
len=1;
ok=0;
}
bign(int x)
{
if(x<0) this->ok=1;
*this=x;
}
bign operator =(char *s)
{
bign a;
int len=strlen(s);
for(int i=0;i<len;i++)
a.z[len-i-1]=s[i]-'0';
a.len=len;
*this=a;
}
bign operator =(int num)
{
char s[25];
bool ok=0;
if(num<0) ok=1,num=-num;
sprintf(s,"%d",num);
*this=s;
if(ok)
{
this->ok=1;
}
}
friend bool operator <(bign a,bign b)
{
if(!a.ok && b.ok) return false;
if(a.ok && !b.ok) return true;
if(a.len!=b.len) return a.len<b.len;
for(int i=a.len-1;i>=0;i--)
{
if(a.z[i]!=b.z[i])
return a.z[i]<b.z[i];
}
return false;
}
friend bool operator >(bign a,bign b)
{
return b<a;
}
friend bool operator ==(bign a,bign b)
{
return !(a<b||b<a);
}
friend bool operator !=(bign a,bign b)
{
return !(a==b);
}
friend bool operator <=(bign a,bign b)
{
return !(a>b);
}
friend bool operator >=(bign a,bign b)
{
return !(a<b);
}
friend bign operator +(bign a,bign b)
{
if(!a.ok && !b.ok)
{
bign c;
int len=max(a.len,b.len)+1;
for(int i=0;i<len;i++)
c.z[i]=a.z[i]+b.z[i];
for(int i=0;i<len;i++)
if(c.z[i]>9) c.z[i+1]++,c.z[i]-=10;
while(len>1 && c.z[len-1]==0) len--;
c.len=len;
return c;
}
if(!a.ok && b.ok)
{
bign c=b;
c.ok=0;
return a-c;
}
if(a.ok && !b.ok)
{
bign c;
a.ok=0;
c=b-a;
a.ok=1;
return c;
}
if(a.ok && b.ok)
{
bign c;
int len=max(a.len,b.len)+1;
for(int i=0;i<len;i++)
c.z[i]=a.z[i]+b.z[i];
for(int i=0;i<len;i++)
if(c.z[i]>9) c.z[i+1]++,c.z[i]-=10;
while(len>1 && c.z[len-1]==0) len--;
c.len=len;
c.ok=1;
return c;
}
}
friend bign operator +(bign a,int b)
{
bign c=b;
return a+c;
}
friend bign operator -(bign a,bign b)
{
if(!a.ok && !b.ok)
{
bign c;
if(a<b)
{
c=b-a;
c.ok=1;
return c;
}
int len=max(a.len,b.len);
for(int i=0;i<len;i++)
c.z[i]=a.z[i]-b.z[i];
for(int i=0;i<len;i++)
if(c.z[i]<0) c.z[i+1]--,c.z[i]+=10;
while(len>1 && c.z[len-1]==0) len--;
c.len=len;
return c;
}
if(!a.ok && b.ok)
{
bign c;
b.ok=0;
c=a+b;
b.ok=1;
return c;
}
if(a.ok && !b.ok)
{
bign c;
a.ok=0;
c=a+b;
a.ok=1;
c.ok=1;
return c;
}
if(a.ok && b.ok)
{
bign c;
a.ok=b.ok=0;
c=b-a;
a.ok=b.ok=1;
return c;
}
}
friend bign operator -(bign a,int b)
{
bign c=b;
return a-c;
}
friend bign operator *(bign a,bign b)
{
if(!a.ok && !b.ok)
{
bign c;
int len=a.len+b.len;
for(int i=0;i<a.len;i++)
for(int j=0;j<b.len;j++)
c.z[i+j]+=a.z[i]*b.z[j];
for(int i=0;i<len;i++)
if(c.z[i]>9) c.z[i+1]+=c.z[i]/=10,c.z[i]%=10;
while(len>1 && c.z[len-1]==0) len--;
c.len=len;
return c;
}
if(!a.ok && b.ok)
{
bign c;
b.ok=0;
c=a*b;
b.ok=1;
c.ok=1;
return c;
}
if(a.ok && !b.ok)
{
bign c;
a.ok=0;
c=a*b;
a.ok=1;
c.ok=1;
return c;
}
if(a.ok && b.ok)
{
bign c;
a.ok=b.ok=0;
c=a*b;
a.ok=b.ok=1;
return c;
}
}
friend bign operator *(bign a,int b)
{
bign c=b;
return a*c;
}
};
const int maxn=105;
const int inf=2000000000;
void bign_out(bign a)
{
if(a.ok)printf("-");
int len=a.len;
for(int i=len-1;i>=0;i--)
{
printf("%d",a.z[i]);
}
printf("\n");
}