1. 程式人生 > >【高精度】模板

【高精度】模板

 自己上學期花了三天打的,long long壓9位,支援進位制轉換,加減乘除,字串初始化,運算等等,應該無敵了

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; 

//注意最低位是從0開始計算的! 

typedef long long LL;
const int max_size=240;
const int L=9;
const int inc=10;
const LL base=1000000000; //1 E L

char buf[20];
int len;

void
write(LL x, bool fill) { while(x>0) buf[len++]=x%inc+'0',x/=inc; if(fill) while(len<L) buf[len++]='0'; while(len) putchar(buf[--len]); } struct hugeint { LL d[max_size],l; bool sig; inline bool equals_zero() const { return l==0; } void operator = (const char *p) { int f=
strlen(p); const char *q=p; sig=false; if(p[0]=='-') { --f; ++q; sig=true; } l=f/L; for(int i=0,tmp;i<l;i++) { d[i]=0; for(int j=L;j>=1;j--) d[i]=d[i]*inc+q[f-i*L-j]-'0'; } if(f%L) { d[l]=0; for(int i=L*l;i<f;i++) d[l]=d[l]*inc+q[i-L*l]-'0'; l++
; } while(l>0&&d[l-1]==0) --l; } void operator = (const hugeint &t) { l=t.l,sig=t.sig; for(int i=0;i<l;i++) d[i]=t.d[i]; } void operator = (char *p) { const char *x=p; *this=x; } template<class T1> void operator = (T1 x) { char str[max_size*L]; int t=0; T1 y=x; while(y!=0) y/=inc,++t; str[t]='\0'; if(x<0) str[0]='-',t++,x=-x; while(x!=0) { str[--t]=x%inc+'0'; x/=inc; } *this=str; } template<class T1> hugeint(const T1 &x) { *this=x; } hugeint(){} bool operator == (const hugeint &t) const { if((sig^t.sig)&&(l>0||t.l>0)||l!=t.l) return false; for(int i=0;i<l;i++) if(d[i]!=t.d[i]) return false; return true; } bool operator < (const hugeint &t) const { if(sig&&!t.sig) return true; if(l<t.l) return sig^true; if(l>t.l) return sig^false; int i; for(i=l-1;i>=0&&t.d[i]==d[i];i--); if(i<0) return false; if(d[i]<t.d[i]) return sig^true; if(d[i]>t.d[i]) return sig^false; } bool operator > (const hugeint &t) const { return t<*this; } bool operator <= (const hugeint &t) const { return *this<t||*this==t; } bool operator >= (const hugeint &t) const { return t<=*this; } hugeint operator - () const { hugeint res=*this; res.sig^=true; return res; } hugeint abs() const { hugeint res=*this; res.sig=false; return res; } template<class T1> hugeint operator << (T1 k) const { hugeint res=*this; res.l+=k; for(int i=res.l-1;i>=k;i--) res.d[i]=res.d[i-k]; for(int i=k-1;i>=0;i--) res.d[i]=0; return res; } template<class T1> hugeint operator >> (T1 k) const { hugeint res=*this; res.l=max(res.l-k,(LL)0); for(int i=0;i<res.l;i++) res.d[i]=res.d[i+k]; return res; } hugeint operator + (const hugeint &t) const { hugeint res; res.sig=sig; res.l=max(l,t.l); LL c=0,k; if(t.sig^sig) { k=this->abs()<t.abs()?1:-1; res.sig^=k==1; for(int i=0;i<res.l;i++) { res.d[i]=((i<t.l?t.d[i]:0)-(i<l?d[i]:0))*k-c; c=res.d[i]<0; res.d[i]+=c*base; } while(res.l>0&&res.d[res.l-1]==0) --res.l; return res; } for(int i=0;i<res.l;i++) { res.d[i]=(i<l?d[i]:0)+(i<t.l?t.d[i]:0)+c; c=res.d[i]>=base; res.d[i]-=c*base; } if(c) res.d[res.l++]=c; return res; } hugeint operator - (const hugeint &t) const { return *this+(-t); } hugeint operator * (const hugeint &t) const { hugeint res; if(t.equals_zero()||this->equals_zero()) { res.l=0; return res; } res.sig=sig^t.sig; res.l=l+t.l-1; LL c; for(int i=0;i<=res.l;i++) res.d[i]=0; for(int i=0;i<l;i++) { c=0; for(int j=0;j<t.l;j++) { res.d[i+j]=res.d[i+j]+d[i]*t.d[j]+c; c=res.d[i+j]/base; res.d[i+j]%=base; } if(c) res.d[i+t.l]=c; } if(res.d[res.l]) ++res.l; while(res.l>0&&res.d[res.l-1]==0) --res.l; return res; } hugeint operator / (const hugeint &t) const { hugeint res,ss=t.abs(); res.sig=sig^t.sig; if(t.equals_zero()||this->abs()<ss) res.l=0; else { res.l=l-t.l+1; LL le,re,me; hugeint r=*this>>(res.l-1); for(int i=res.l-1;i>=0;i--) { le=((r.l>=t.l?r.d[t.l-1]:0)+(r.l>t.l?r.d[t.l]*base:0))/(t.d[t.l-1]+1); re=((r.l>=t.l?r.d[t.l-1]:0)+(r.l>t.l?r.d[t.l]*base:0)+1)/t.d[t.l-1]; while(le<re) { me=re+le+1>>1; if(r<t*me) re=me-1; else le=me; } res.d[i]=le; r=(r-ss*le<<1)+d[i-1]; } if(res.d[res.l-1]==0) --res.l; } return res; } hugeint operator % (const hugeint &x) const { hugeint tmp=this->abs()/x*x; return this->sig?*this+tmp+x.abs():*this-tmp; } void print() { if(l==0) { puts("0"); return ; } if(sig) putchar('-'); write(d[l-1],false); for(int i=l-2;i>=0;i--) write(d[i],true); puts(""); } }A,B,C,M; char s1[max_size*L],s2[max_size*L]; int n,tot; int main() { /* A="65465468468468468468"; B=-546546464; ((A%B*54641-5151+454654)*"64542434534654654").print(); */ // scanf("%s",s1); A="11281783718378173818378138797897987987987987099898989008098098718978978976748747489679847698478967984768479674986749876984769874986794798674986798479864789666666666666666666666666666666999999999947867487587475874858485748758748578478574875847857487584758748578475847857487584785787817837988979878998789798780987988888888888888888888888888888888888888888888978798798798789798798787879767165356156261526617261979381983018209189281987267467627647237819820182091000000000000000000000000000000000000009187291729817982711281783718378173818378138797897987987987987099898989008098098718978978976748747489679847698478967984768479674986749876984769874986794798674986798479864789666666666666666666666666666666999999999947867487587475874858485748758748578478574875847857487584758748578475847857487584785787817837988979878998789798780987988888888888888888888888888888888888888888888978798798798789798798787879767165356156261526617261979381983018209189281987267467627647237819820182091000000000000000000000000"; B="8679479867498679847986478966666666666666666666666666666699999999994786748758747587485848574875874857847857487584785748758475874857847584785748758478578781783798897987899878979878098798888888888888888888888888888888888888888888897879879879878979879878787976716535615626152661726197938198301820918928198726746762764723781982018209100000000000000000000000000000000000000918729172981798271128178371837817381837813879789798798798798709989898900809809871897897897674874748967984769847896798476847967498674987698476"; C=A; int k=500; while(k--) A/B; printf("f"); /* while(B+1<C) { M=(B+C)*(base/2)>>1; if(M*M>A) C=M; else B=M; } B.print();*/ return 0; }