高精模板
来源:互联网 发布:centos 7 和6的阿帕奇 编辑:程序博客网 时间:2024/06/05 19:32
自己写的高精模板。
测试过这些题:
poj3378,poj2506,poj1001高精小数,poj1406,poj2389,poj1306,poj2325。
当然poj的坑爹数据,不保证是不是还有坑点。
不过好处是没有刻意缩行,意思比较明白,可以根据具体题目稍作修改或是扩展。
notice:
0.l保存位数,从0开始。s[maxl]保存每一位数字。
1.bsize 是一个位保存的大小,一般用10000或10。
bbit 对应为4或1。
bsav[]是做除法用的。
2.除法是-1000、-100、-10、-1倍这样来做的,复杂度还可以接受吧,最多是O(l1*l2*40)。
3.高精除int,高精乘int或longlong要注意溢出,不行就转为高精再做。
4.高精小数为了方便写,只写了一位的。bbit要设为1,bsize设为10。
看得顺眼的童鞋就拿去用吧~
测试过这些题:
poj3378,poj2506,poj1001高精小数,poj1406,poj2389,poj1306,poj2325。
当然poj的坑爹数据,不保证是不是还有坑点。
不过好处是没有刻意缩行,意思比较明白,可以根据具体题目稍作修改或是扩展。
notice:
0.l保存位数,从0开始。s[maxl]保存每一位数字。
1.bsize 是一个位保存的大小,一般用10000或10。
bbit 对应为4或1。
bsav[]是做除法用的。
2.除法是-1000、-100、-10、-1倍这样来做的,复杂度还可以接受吧,最多是O(l1*l2*40)。
3.高精除int,高精乘int或longlong要注意溢出,不行就转为高精再做。
4.高精小数为了方便写,只写了一位的。bbit要设为1,bsize设为10。
看得顺眼的童鞋就拿去用吧~
#define maxl 260#define bbit 4#define bsize 10000int bsav[10]={1,10,100,1000};struct bign{ int l,s[maxl]; bign(){l=0;memset(s,0,sizeof(s));} void init(){l=0;memset(s,0,sizeof(s));} bign operator =(int a){ this->init(); while(a){s[l++]=a%bsize;a=a/bsize;} while(l&&s[l]==0) --l; return *this; } bign operator =(long long a){ this->init(); while(a){s[l++]=a%bsize;a=a/bsize;} while(l&&s[l]==0) --l; return *this; } bign operator =(char *a){ this->init(); int tmp,i,j,tl=strlen(a); for(i=tl-1;i>=bbit;i-=bbit){ tmp=0; for(j=bbit-1;j>=0;--j){ tmp=tmp*10+a[i-j]-'0'; } s[l++]=tmp; } tmp=0; for(j=0;j<=i;++j){ tmp=tmp*10+a[j]-'0'; } s[l++]=tmp; while(l&&s[l]==0) --l; return *this; } bool operator ==(bign b){ if (l!=b.l) return false; for(int i=l;i>=0;--i) if (s[i]!=b.s[i]) return false; return true; } bool operator <(bign b){ if (l!=b.l) return l<b.l; for(int i=l;i>=0;--i) if (s[i]!=b.s[i]) return s[i]<b.s[i]; return false; } bool operator !=(bign b){return !(*this==b);} bool operator <=(bign b){return *this<b||*this==b;} bool operator > (bign b){return b<*this;} bool operator >=(bign b){return b<*this||*this==b;} bign operator +(bign b){ bign r; r.l=l>b.l?l:b.l; int i,c=0; for(i=0;i<=r.l;++i){ r.s[i]=s[i]+b.s[i]+c; c=r.s[i]/bsize; r.s[i]%=bsize; } if (c) r.s[++r.l]=c; return r; } bign operator +(int b){bign r;r=b;return *this+r;} bign operator +=(bign b){return *this=*this+b;} bign operator +=(int b){return *this=*this+b;} bign operator -(bign b){ bign r; r.l=l; int i,c=0; for(i=0;i<=l;++i){ r.s[i]=s[i]-b.s[i]+c; if (r.s[i]<0) {c=-1;r.s[i]+=bsize;} else c=0; } while(r.l&&r.s[r.l]==0) --r.l; return r; } bign operator -(int b){bign r;r=b;return *this-r;} bign operator -=(bign b){return *this=*this-b;} bign operator -=(int b){return *this=*this-b;} bign operator *(bign b){ bign r; int i,j; for(i=0;i<=l;++i){ for(j=0;j<=b.l;++j){ r.s[i+j]+=s[i]*b.s[j]; if (r.s[i+j]>=bsize) {r.s[i+j+1]+=r.s[i+j]/bsize;r.s[i+j]%=bsize;} } } r.l=l+b.l+1; while(r.l&&r.s[r.l]==0) --r.l; return r; } bign operator *(long long b){//caution for long long overflow bign r; int i; long long t=0; for(i=0;i<=l;++i){ t+=s[i]*b; r.s[i]=t%bsize; t=t/bsize; } r.l=l; while(t){r.s[++r.l]=t%bsize;t=t/bsize;} while(r.l&&r.s[r.l]==0) --r.l; return r; } bign operator *=(bign b){return *this=*this*b;} bign operator *=(long long b){return *this=*this*b;} void shlnadd(int val){ for(int i=l;i>=0;--i){s[i+1]=s[i];} s[0]=val; ++l; while(l&&s[l]==0) --l; } bign operator /(bign b){ bign r,t; int i,j; bign tb[bbit]; for(i=0;i<bbit;++i) tb[i]=b*bsav[i]; for(i=l;i>=0;--i){ t.shlnadd(s[i]); for(j=bbit-1;j>=0;--j){ while(tb[j]<=t){ t-=tb[j]; r.s[i]+=bsav[j]; } } } if (l>b.l) r.l=l-b.l; else r.l=0; while(r.l&&r.s[r.l]==0) --r.l; return r; } bign operator /(int b){ //caution for int overflow:1000*b int i,j; bign r; int tb[bbit]; int t=0; for(i=0;i<bbit;++i) tb[i]=b*bsav[i]; for(i=l;i>=0;--i){ t=t*bsize+s[i]; for(j=bbit-1;j>=0;--j){ while(tb[j]<=t){ t-=tb[j]; r.s[i]+=bsav[j]; } } } r.l=l; while(r.l&&r.s[r.l]==0) --r.l; return r; } //bign operator /(int b){bign r;r=b;return *this/r;} bign operator /=(bign b){return *this=*this/b;} bign operator /=(int b){return *this=*this/b;} void print(int func){ printf("%d",s[l]); for(int i=l-1;i>=0;--i) printf("%04d",s[i]); if (func) puts(""); }};//高精小数,bbit只能为1struct bigf{ bign num; int pos; bigf(){num.init();pos=0;} bigf operator =(char *s){ int l=strlen(s); int tmp=0; for(int i=0;i<l;++i){ if (s[i]=='.') pos=l-1-i; else tmp=tmp*10+s[i]-'0'; } num=tmp; } bigf operator *(bigf b){ bigf ret; ret.num=num*b.num; ret.pos=pos+b.pos; return ret; } void print(){ int i,b=pos; for(i=0;i<pos;++i) if (num.s[i]!=0) {b=i;break;} for(i=num.l;i>=pos;--i) printf("%d",num.s[i]); printf("."); for(i=pos-1;i>=b;--i) printf("%d",num.s[i]); }};
0 0
- 高精模板
- 高精模板
- 高精模板
- 高精模板
- 高精模板
- 高精模板
- c++高精模板(+ ,-,*,/)
- DAY-1高精模板
- 高精模板 重载运算符 (+,-,*)
- 计算高斯模板
- 计算高斯模板
- 【高精度模板】【高精加减乘没有除】
- 高斯过滤得到高斯模板
- 生成高斯模板(C++)
- 生成高斯模板(C++)
- java 产生高斯模板
- 压位高精模板(支持加法、高精乘低精、高精除低精)
- 【给将来学神的算法详解--高精】(1)(我的)高精度模板
- 怎样的金融IT公司才算好公司
- cowboy rest
- 帕累托法则 (精简)
- C++编译器与链接器工作原理
- 遗传算法
- 高精模板
- 10.05 Ralph Lauren POLO Udsalg
- Linux 文件系统初步
- elixir quote, macro
- 10.05 Ralph Lauren POLO Udsalg
- 10.05 Ralph Lauren POLO Udsalg
- 10.05 Ralph Lauren POLO Udsalg
- 归并排序法
- 10.05 Ralph Lauren POLO Udsalg