高精度模板

sdxjzsq

2018-10-31 10:25:05

Personal

高精度板子,封装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); } }; ```