高精度模板(重载运算符)
重载运算符,应该是最方便写和调用的高精度写法了。
代码:
struct haa
{
int len,a[N];
haa(){len=1;memset(a,0,sizeof(a));}
haa(ll x){while(x) a[++len]=x%10,x/=10;}
};
char s[N];
inline haa read_haa()
{
haa ret;
scanf("%s",s+1);
ret.len=strlen(s+1);
for(int i=ret.len;i>=1;i--) ret.a[i]=s[ret.len-i+1]-(int)'0';
return ret;
}
inline void print_haa(const haa ret)
{
for(int i=ret.len;i>=1;i--)
printf("%d",ret.a[i]);
putchar('\n');
}
inline haa operator + (const haa &x,const haa &y)//高精+高精
{
haa ret; ret.len=max(x.len,y.len)+1;
int up=0;
for(int i=1;i<=ret.len;i++)
{
ret.a[i]=(up+x.a[i]+y.a[i]);
up=ret.a[i]/10;
ret.a[i]%=10;
}
while(ret.len>1&&!ret.a[ret.len]) ret.len--;
return ret;
}
inline haa operator / (const haa &x,const ll &y)//高精/低精
{
haa ret; ret.len=x.len;
ll down=0ll;//这里别忘了开 long long
for(int i=ret.len;i>=1;i--)
{
ret.a[i]=(down*10+x.a[i])/y;
down=(down*10+x.a[i])%y;
}
while(ret.len>1&&!ret.a[ret.len]) ret.len--;
return ret;
}
inline haa operator * (const haa &x,const haa &y)//高精*高精
{
haa ret; ret.len=x.len+y.len;
for(int i=1;i<=x.len;i++)
for(int j=1;j<=y.len;j++)
ret.a[i+j-1]+=x.a[i]*y.a[j];
int up=0;
for(int i=1;i<=ret.len;i++)
{
ret.a[i]+=up;
up=ret.a[i]/10;
ret.a[i]%=10;
}
while(ret.len>1&&!ret.a[ret.len]) ret.len--;
return ret;
}