高精度模板
sdxjzsq
2018-10-31 10:25:05
高精度板子,封装hll
```cpp
struct hll
{
int v[maxn],len;
hll()
{
v[1]=0;//memset(v,0,sizeof(v));
len=1;
}
hll(char *ss)
{
*this=ss;
}
hll(long long t)
{
*this=t;
}
hll(int t)
{
*this=t;
}
hll& operator = (const char *ss)
{
len=strlen(ss);
for(register int i=0;i<len;i++)
v[len-i]=ss[i]-48;
return *this;
}
hll& operator = (const long long& t)
{
len=1;
if(t==0){v[len]=0;return *this;}
long long ss=t;
while(ss)
{
v[len++]=ss%10;
ss/=10;
}
len--;
return *this;
}
hll& operator = (const int& t)
{
len=1;
if(t==0){v[len]=0;return *this;}
int ss=t;
while(ss)
{
v[len++]=ss%10;
ss/=10;
}
len--;
return *this;
}
hll& operator = (const hll& t)
{
len=t.len;
for(register int i=1;i<=len;i++)
v[i]=t.v[i];
return *this;
}
inline bool operator == (const hll& t)
{
if(t.len>len||len>t.len)return 0;
for(register int i=1;i<=len;i++)
if(v[i]!=t.v[i])return 0;
return 1;
}
inline bool operator < (const hll& rhs) const
{
if(rhs.len>len)return 1;
if(rhs.len<len)return 0;
for(register int i=len;i>0;i--)
{
if(v[i]<rhs.v[i])return 1;
if(v[i]>rhs.v[i])return 0;
}
return 0;
}
hll operator + (const hll& t)
{
hll ans;
ans.len=max(t.len,len);
for(register int i=1;i<=ans.len+1;i++)ans.v[i]=0;
for(register int i=1;i<=ans.len;i++)
{
if(i<=len&&i<=t.len)ans.v[i]+=v[i]+t.v[i];
else if(i>len)ans.v[i]+=t.v[i];
else ans.v[i]+=v[i];
if(ans.v[i]>=10)ans.v[i+1]++,ans.v[i]-=10;
}
if(ans.v[ans.len+1])ans.len++;
return ans;
}
hll operator * (const hll& t)
{
hll ans;
ans.len=len+t.len;
for(register int i=1;i<=ans.len;i++)ans.v[i]=0;
for(register int i=1;i<=len;i++)
for(register int j=1;j<=t.len;j++)
{
ans.v[i+j-1]+=v[i]*t.v[j];
if(ans.v[i+j-1]>=10)
{
ans.v[i+j]+=ans.v[i+j-1]/10;
ans.v[i+j-1]%=10;
}
}
while(ans.v[ans.len]>=10)ans.v[ans.len+1]=ans.v[ans.len]/10,ans.v[ans.len]%=10,ans.len++;
while(ans.v[ans.len]==0&&ans.len>1)ans.len--;
return ans;
}
hll operator / (const long long &t)
{
hll tmp=*this,ans;
ans.len=len;for(register int i=1;i<=ans.len;i++)ans.v[i]=0;
for(register int i=len;i>0;i--)
{
if(tmp.v[i]<t)tmp.v[i-1]+=(tmp.v[i]<<1)+(tmp.v[i]<<3);
else
{
ans.v[i]=tmp.v[i]/t;
tmp.v[i]%=t;
tmp.v[i-1]+=(tmp.v[i]<<1)+(tmp.v[i]<<3);
}
}
while(ans.v[ans.len]==0&&ans.len>1)ans.len--;
return ans;
}
inline void print()
{
for(register int i=len;i>0;i--)
putchar(v[i]+48);
}
};
```