大数高精度运算(模板)
来源:互联网 发布:沃伦夫妇的真实性 知乎 编辑:程序博客网 时间:2024/05/22 01:29
前言:高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。
模板:包括大数加减乘除,大数与int数的乘法,模板可以不断扩充。
代码:
/*全部亲测可用,但是不能用于负数的运算,只能对正数进行大数运算*/const int ten[4]= {1,10,100,1000};const int maxl = 300;struct BigNumber{ int d[maxl]; char s[maxl]; BigNumber(const char s[]) { int len=strlen(s); d[0]=(len-1)/4+1; int i,j,k; for(int i=1; i<maxl; i++) d[i]=0; for(int i=len-1; i>=0; i--) { j=(len-i-1)/4+1; k=(len-i-1)%4; d[j]+=ten[k]*(s[i]-'0'); } while(d[0]>1&&d[d[0]]==0) d[0]--; } BigNumber() { *this=BigNumber("0"); } BigNumber(int x) { for (int i=0; i<maxl; i++) d[i]=0; if (!x) d[0]=1; while(x) { d[++d[0]]=x%10000; x/=10000; } } BigNumber(long long x) { for (int i=0; i<maxl; i++) d[i]=0; if (!x) d[0]=1; while(x) { d[++d[0]]=x%10000; x/=10000; } } void print() { int len=d[0]; printf("%d",d[d[0]]); for(int i=len-1; i>=1; i--) { if(d[i]>=1000) printf("%d",d[i]); else if(d[i]>=100) printf("0%d",d[i]); else if(d[i]>=10) printf("00%d",d[i]); else printf("000%d",d[i]); } printf("\n"); } void toString() { int top=0; int i,j,temp; for(i=3; i>=1; i--) if(d[d[0]]>=ten[i]) break; temp=d[d[0]]; for(j=i; j>=0; j--) { s[top++]=(char)(temp/ten[j]+'0'); temp%=ten[j]; } for(i=d[0]-1; i>0; i--) { temp=d[i]; for(j=3; j>=0; j--) { s[top++]=(char)(temp/ten[j]+'0'); temp%=ten[j]; } } }} zero=BigNumber(),d,temp,mid1[15],a[3005];bool operator < (const BigNumber &a,const BigNumber &b){ if(a.d[0]!=b.d[0]) return a.d[0]<b.d[0]; int i; for(i=a.d[0]; i>0; i--) if(a.d[i]!=b.d[i]) return a.d[i]<b.d[i]; return false;}bool operator > (const BigNumber &a,const BigNumber &b){ if(b.d[0]!=a.d[0]) return b.d[0]<a.d[0]; int i; for(i=b.d[0]; i>0; i--) if(a.d[i]!=b.d[i]) return b.d[i]<a.d[i]; return false;}bool operator ==(const BigNumber &a,const BigNumber &b){ int i; if(a.d[0]!=b.d[0]) return false; for(i=1; i<=a.d[0]; i++) if(a.d[i]!=b.d[i]) return false; return true;}bool operator <= (const BigNumber &a,const BigNumber &b){ return a<b||a==b;}bool operator >= (const BigNumber &a,const BigNumber &b){ return a>b||a==b;}BigNumber operator +(const BigNumber &a,const BigNumber &b){ BigNumber c; c.d[0]=max(a.d[0],b.d[0]); int i,x=0; for(i=1; i<=c.d[0]; i++) { x=a.d[i]+b.d[i]+x; c.d[i]=x%10000; x/=10000; } while(x!=0) { c.d[++c.d[0]]=x%10000; x/=10000; } return c;}BigNumber operator -(const BigNumber &a,const BigNumber &b){ BigNumber c; c.d[0]=a.d[0]; int i,x=0; for(i=1; i<=c.d[0]; i++) { x=10000+a.d[i]-b.d[i]+x; c.d[i]=x%10000; x=x/10000-1; } while((c.d[0]>1)&&(c.d[c.d[0]]==0)) c.d[0]--; return c;}BigNumber operator *(const BigNumber &a,const BigNumber &b){ BigNumber c; c.d[0]=a.d[0]+b.d[0]; int i,j,x; for(i=1; i<=a.d[0]; i++) { x=0; for(int j=1; j<=b.d[0]; j++) { x=a.d[i]*b.d[j]+x+c.d[i+j-1]; c.d[i+j-1]=x%10000; x/=10000; } c.d[i+b.d[0]]=x; } while((c.d[0]>1)&&(c.d[c.d[0]]==0)) --c.d[0]; return c;}bool smaller(const BigNumber &a,const BigNumber &b,int delta){ if(a.d[0]+delta!=b.d[0]) return a.d[0]+delta<b.d[0]; int i; for(i=a.d[0]; i>0; i--) if(a.d[i]!=b.d[i+delta]) return a.d[i]<b.d[i+delta]; return true;}void Minus (BigNumber &a,const BigNumber &b,int delta){ int i,x=0; for(i=1; i<=a.d[0]-delta; i++) { x=10000+a.d[i+delta]-b.d[i]+x; a.d[i+delta]=x%10000; x=x/10000-1; } while((a.d[0]>1)&&(a.d[a.d[0]]==0)) a.d[0]--;}BigNumber operator *(const BigNumber &a,const int &k){ BigNumber c; c.d[0]=a.d[0]; int i,x=0; for(i=1; i<=a.d[0]; i++) { x=a.d[i]*k+x; c.d[i]=x%10000; x/=10000; } while(x>0) { c.d[++c.d[0]]=x%10000; x/=10000; } while((c.d[0]>1)&&(c.d[c.d[0]]==0)) c.d[0]--; return c;}BigNumber operator /(const BigNumber &a,const BigNumber &b){ BigNumber c; d=a; int i,j,temp; mid1[0]=b; for(int i=1; i<=13; i++) mid1[i]=mid1[i-1]*2; for(i=a.d[0]-b.d[0]; i>=0; i--) { temp=8192; for(j=13; j>=0; j--) { if(smaller(mid1[j],d,i)) { Minus(d,mid1[j],i); c.d[i+1]+=temp; } temp/=2; } } c.d[0]=max(1,a.d[0]-b.d[0]+1); while((c.d[0]>1)&&(c.d[c.d[0]]==0)) c.d[0]--; return c;}BigNumber operator %(const BigNumber &a,const BigNumber &b){ BigNumber c=a/b; return a-b*c;}
4 1
- 大数高精度运算(模板)
- 高精度大数运算模板
- 大数(高精度)运算
- 高精度模板(大数)
- 高精度模板 大数的基本运算
- 大数减法 (高精度运算)
- 大数(相加,高精度)模板
- 大数运算(模板)
- 大数(高精度)加减乘除取模运算
- 高精度幂运算(java大数)
- 高精度运算 大数加法
- 大数高精度运算
- 大数(高精度数)模板
- 大数高精度模板
- 高精度/大数模板
- 大数高精度加减乘除模板
- 大数模板(高精度)
- 大数运算(高精度运算)——通用解决方案
- APK在AndroidManifest.xml常用权限
- 过了把
- Linux中link,unlink,close,fclose详解
- GCD介绍(四): 完结
- gcc实用扩展总结
- 大数高精度运算(模板)
- Junit使用教程(一)
- DBlink
- 最大堆和最小堆
- 慎用string.resize()
- 弹出输入文本框上弹的动画效果
- Sqlite数据库约束条件详解
- Junit使用教程(二)
- hibernate通过数据库表反向生成实体类