大整数模板
又臭又长系列233
嗯,没有写除法,乘法是T(10len^3)级别.....
常数极大
切勿模仿233333
int SYS=10; class bign { public: int v[300]; int len; //==================================================== //INIT //==================================================== bign(){ memset(v,0,sizeof(v)); len=1; } bign(int k) { memset(v,0,sizeof(v)); len=0; while(k!=0) { v[len++]=k%SYS; k/=SYS; } } bign(const char*f,int l) { memset(v,0,sizeof(v)); len=1; for( len=0;len<l;len++ ) v[l-len-1]=( f[len]>='0' && f[len]<='9' ) ? f[len]-'0' : f[len]-'A'+10; } bign(const bign&f) { len=f.len; memcpy(v,f.v,sizeof(v)); } bign operator=(bign f) { memcpy(v,f.v,sizeof(v)); len=f.len; return *this; } //=================================================== //CALCULATION //==================================================== int&operator[](const int&k) { return v[k]; } //==========compare========== bool operator<(bign f) { if(len!=f.len) return len<f.len; for(int i=len-1;i>=0;i--) if(v[i]!=f[i]) return v[i]<f[i]; return false; } bool operator<=(bign f) { if(len!=f.len) return len<f.len; for(int i=len-1;i>=0;i--) if(v[i]!=f[i]) return v[i]<f[i]; return true; } bool operator>(bign f) { return f<(*this); } bool operator>=(bign f) { return f<=(*this); } bool operator==(bign f) { if(f.len!=len) return false; for(int i=len-1;i>=0;i--) if(v[i]!=f[i]) return false; return true; } //========== add ========== bign operator+(bign f) { bign c; c.len=max(len,f.len); for(int i=0;i<=c.len;i++) (c[i]+=v[i]+f[i]) >=SYS ? c[i]-=SYS,++c[i+1] : NULL; if(c[c.len]!=0) c.len++; return c; } bign operator+=(bign f) { len=max(len,f.len); for(int i=0;i<=len;i++) (v[i]+=f[i]) >=SYS ? v[i]-=SYS,++v[i+1] : NULL; if(v[len]!=0) len++; return *this; } bign operator+(int f) { bign c(f); return c+(*this); } //==========minus========== bign operator-(bign f) //return absolute. { if((*this)<f) return f-(*this); //make sure (*this) is larger bign c; c.len=len; for(int i=0;i<c.len;i++) (c[i]+=v[i]-f[i]) <0 ? c[i]+=SYS,--c[i+1] : NULL; while(c.len>0 && c[c.len]==0) c.len--; if(c[c.len]!=0 || c.len==0)c.len++; return c; } //==========multiply========== bign operator<<=(int k) { if(k==0) return *this; if(len==1 && v[0]==0) return *this; for(int i=len-1;i>=0;i--) v[i+k]=v[i]; for(int i=0;i<k;i++) v[i]=0; len=len+k; return *this; } bign operator<<(int k) { bign c(*this); return (c<<=k); } bign operator>>=(int k) { if(k==0) return*this; for(int i=0;i<len-k;i++) v[i]=v[i+k]; for(int i=max(0,len-k);i<len;i++) v[i]=0; len=max(1,len-k); return *this; } bign operator>>(int k) { bign c(*this); return (c>>=k); } bign operator*(int f) { bign c; int g=0; for(int i=0;i<len || g!=0;i++,c.len=i) c[i]=v[i]*f+g, g=c[i]/SYS, c[i]=c[i]%SYS ; while(c[c.len]==0 && c.len>=0 ) c.len--; c.len++; return c; } bign operator*(bign f) { bign c; c.len=len+f.len-1; for(int i=0;i<len;i++) { for(int j=0;j<f.len;j++) c[i+j]+=v[i]*f[j]; for(int j=0;j<=c.len;j++) c[j]>=SYS ? c[j+1]+=c[j]/SYS , c[j]%=SYS : NULL; } for(int i=0;i<=c.len;i++) c[i]>=10 ? c[i+1]+=c[i]/SYS , c[i]/=SYS : NULL; if(c[c.len]!=0) c.len++; if(c[c.len]!=0) c.len++; return c; } //==========divide========== bign operator/(int k) { bign c; c.len=-1; int t=0; for(int i=len-1;i>=0;i--) { t=t*10+v[i]; if(t/k!=0) { c[i]=t/k; t%=k; if(c.len==-1) c.len=i+1; } } if(c.len==-1) c.len=1; return c; } bign operator/(bign f) { bign c("0",1); if(f>(*this)) return c; c.len=-1; bign h("0",1); for(int i=len-1;i>=0;i--) { h=(h*10)+v[i]; while(h>=f) h=h-f,c[i]++; if(c.len==-1 && c[i]!=0) c.len=i+1; } return c; } bign operator%(int k) { return (*this)-((*this)/k)*k; } bign operator%(bign f) { return (*this)-(*this)/f*f; } //==================================================== //OUTPUT //==================================================== void test() { printf("TEST : %d \n",len); printf("NUM: "); for(int i=len-1;i>=0;i--) printf("%d ",v[i]); printf("\n"); } void output() { for(int i=len-1;i>=0;i--) if(v[i]>=0 && v[i]<=9) printf("%d",v[i]); else printf("%c",'A'+v[i]-10); printf("\n"); } void output(int&k) { k=0; int s=1; for(int i=0;i<len;s*=SYS,i++) k+=s*v[i]; } void output(char*f) { for(int i=0;i<len;i++) f[i]=v[i]+'0'; } };