高精模板
来源:互联网 发布:淘宝店进货渠道有哪些 编辑:程序博客网 时间:2024/06/02 20:02
高精加和乘很简单,主要是高精减和高精除,均是模拟竖式运算,同时以10000进制,高精除里面用了二分.
关键的一点就是高精乘除里面最后的判前导0部分.
#define M 1000#define P 10000struct BigInt{ int num[M]; int len; BigInt(){ memset(num,0,sizeof(num)); len=0; } void rd(){ char str[M]; scanf("%s",str); int n=strlen(str); len=0; for(int i=n-1;i>=0;i-=4){ int p=0; for(int j=max(0,i-3);j<=i;j++)p=(p<<3)+(p<<1)+(str[j]^48); num[len++]=p; } } bool operator <(const BigInt &tmp)const{ if(len!=tmp.len)return len<tmp.len; for(int i=len-1;i>=0;--i) if(num[i]!=tmp.num[i])return num[i]<tmp.num[i]; return 0; } BigInt operator +(const BigInt &tmp)const{ BigInt C; C.len=max(len,tmp.len); for(int i=0;i<C.len;i++){ C.num[i]+=num[i]+tmp.num[i]; if(C.num[i]>=P)C.num[i]-=P,C.num[i+1]++; } if(C.num[C.len]>0)C.len++; return C; } BigInt operator *(const BigInt &tmp)const{ BigInt C; C.len=len+tmp.len; for(int i=0;i<len;i++) for(int j=0;j<tmp.len;j++){ C.num[i+j]+=num[i]*tmp.num[j]; if(C.num[i+j]>=P)C.num[i+j+1]+=C.num[i+j]/P,C.num[i+j]%=P; } while(C.len>1&&C.num[C.len-1]==0)C.len--; return C; } BigInt operator -(const BigInt &tmp)const{ BigInt C; for(int i=0;i<len;i++){ C.num[i]+=num[i]-tmp.num[i]; C.num[i+1]+=C.num[i]/P; C.num[i]%=P; if(C.num[i]<0)C.num[i]+=P,C.num[i+1]--; } C.len=len; while(C.len>1&&C.num[C.len-1]==0)C.len--; return C; } BigInt operator /(const BigInt &tmp)const{ BigInt C,ans; for(int i=0;i<len;i++)C.num[i]=num[i]; C.len=len; for(int i=len-tmp.len;i>=0;i--){ BigInt L,R,res; L.len=R.len=i+1; L.num[i]=0,R.num[i]=P-1; while(L.num[i]<=R.num[i]){ BigInt mid; mid.len=i+1; mid.num[i]=L.num[i]+R.num[i]>>1; if(C<mid*tmp)R.num[i]=mid.num[i]-1; else res=mid,L.num[i]=mid.num[i]+1; } C=C-res*tmp; ans=ans+res; } while(ans.len>1&&ans.num[ans.len-1]==0)ans.len--; return ans; } void pf(){ printf("%d",num[len-1]); for(int i=len-2;i>=0;--i)printf("%04d",num[i]); putchar('\n'); }};
0 0
- 高精模板
- 高精模板
- 高精模板
- 高精模板
- 高精模板
- 高精模板
- c++高精模板(+ ,-,*,/)
- DAY-1高精模板
- 高精模板 重载运算符 (+,-,*)
- 计算高斯模板
- 计算高斯模板
- 【高精度模板】【高精加减乘没有除】
- 高斯过滤得到高斯模板
- 生成高斯模板(C++)
- 生成高斯模板(C++)
- java 产生高斯模板
- 压位高精模板(支持加法、高精乘低精、高精除低精)
- 【给将来学神的算法详解--高精】(1)(我的)高精度模板
- 名家博客收集
- Scikit-learn:模型评估Model evaluation 之绘图
- 反射机制
- 【Linux4.1.12源码分析】协议栈gro收包之MAC层处理
- 想运营好社交媒体帐号?这11条提醒可别忘了
- 高精模板
- 《JavaScript 闯关记》之单体内置对象
- MYSQL千万级数据量的优化方法积累
- UVA 12118 图+欧拉路
- 试探法
- 单片机栈溢出的一种检测方法
- bfs与dfs
- 基于codeigniter框架写的网站日志系统适配器(支持写入本地文件、数据库、远程服务器)
- mysql主从同步