高精度
高精度模板
其实我认为这个玩意儿没什么必要写,但是它的确属于联赛知识点,我就直接把代码挂上,看着代码也很好理解.
struct bigint
{
ll a[maxn],len=1;
inline bigint() { memset(a,0,sizeof(a)); len=1; }
inline bigint(ll x) { a[1]=x;len=1; }
};
加法
struct bigint
{
ll a[maxn],len=1;
inline bigint() { memset(a,0,sizeof(a)); len=1; }
inline bigint(ll x) { a[1]=x;len=1; }
inline friend bigint operator+(rg bigint a,rg bigint b)
{
rg bigint c;rll i=1;
for(;i<=a.len||i<=b.len;i++)
{
c.a[i]+=a.a[i]+b.a[i];
c.a[i+1]+=c.a[i]/base;c.a[i]%=base;
}
if(!c.a[i]) i--;c.len=i;return c;
}
};
减法
struct bigint
{
ll a[maxn],len=1;
inline bigint() { memset(a,0,sizeof(a)); len=1; }
inline bigint(ll x) { a[1]=x;len=1; }
inline friend bigint operator-(rg bigint a,rg bigint b)
{
rg bigint c;
rll i;
for(i=1;i<=a.len||i<=b.len;i++)
{
if(a.a[i]<b.a[i])
a.a[i]+=10,a.a[i+1]--;
c.a[i]=a.a[i]-b.a[i];
}
while((!c.a[i])&&i>1) i--;
c.len=i;
return c;
}
};
乘法
struct bigint
{
ll a[maxm],len;
bigint() { memset(a,0,sizeof(a));len=1; }
bigint(rll x)
{
memset(a,0,sizeof(a));len=0;
while(x) a[++len]=x%base,x/=base;
}
inline friend bigint operator*(rg bigint a,rll b)// 高乘低
{
rll x=0;
for(rll i=1;i<=a.len;i++) { rll y=a.a[i]*b+x;a.a[i]=y%base;x=y/base; }
while(x) a.a[++a.len]=x%base,x/=base;return a;
}
inline friend bigint operator*(rg bigint a,rg bigint b)// 高乘高
{
rg bigint c;
for(rll i=1;i<=a.len;i++)
for(rll j=1;j<=b.len;j++)
{
c.a[i+j-1]+=a.a[i]*b.a[j];
c.a[i+j]+=c.a[i+j-1]/base;c.a[i+j-1]%=base;
}
c.len=a.len+b.len;while(c.len>1&&(!c.a[c.len])) c.len--;return c;
}
};
除法
struct bigint
{
ll a[maxm],len;
bigint() { memset(a,0,sizeof(a));len=1; }
bigint(rll x)
{
memset(a,0,sizeof(a));len=0;
while(x) a[++len]=x%base,x/=base;
}
inline friend bigint operator/(rg bigint a,rll b)
{
rll x=0;
for(rll i=a.len;i;i--) { x+=a.a[i];a.a[i]=x/b;x=x%b*base; }
while((!a.a[a.len])&&a.len>1) a.len--;return a;
}
};
--END--

浙公网安备 33010602011771号
我的博客: 𝟷𝙻𝚒𝚞
本文链接: https://www.cnblogs.com/1Liu/articles/16754992.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!