高精度除法
来源:互联网 发布:北京三一重工java招聘 编辑:程序博客网 时间:2024/05/16 14:11
高精度除法,其实还是模拟,不过需要结合高精度加法、减法进行模拟
#include<iostream>#include<string>using namespace std;string rev(string a){ string ret=a; int n=a.size(); for(int i=0;i<n/2;i++) { swap(ret[i],ret[n-i-1]);//得到逆序字符串 } return ret;}string add(string a,string b)//大整数加法 { int lena=a.size(); int lenb=b.size(); a=rev(a); b=rev(b); int carry=0; string c; int i; for(i=0;i<lena&&i<lenb;i++) { int ai=a[i]-'0'; int bi=b[i]-'0'; int ci=ai+bi+carry; c+=(ci%10)+'0';//(ci%10)+'0'整体是一个字符,即(char)((ci%10)+'0') carry=ci/10; } for(;i<lena;i++) { int ai=a[i]-'0'; int ci=ai+carry; c+=(ci%10)+'0'; carry=ci/10; } for(;i<lenb;i++) { int bi=b[i]-'0'; int ci=bi+carry; c+=(ci%10)+'0'; carry=ci/10; } if(carry==1) c=c+'1'; return rev(c);}string sub(string a,string b){ int lena=a.size(); int lenb=b.size(); if(lena<lenb||(lena==lenb&&a<b)) return ""; a=rev(a); b=rev(b); int carry=0; string c; int i; for(i=0;i<lena&&i<lenb;i++) { int ai=a[i]-'0'; int bi=b[i]-'0'; int ci=ai-bi-carry; if(ci<0) { ci+=10; carry=1; } else carry=0; c+=(ci%10)+'0'; } for(;i<lena;i++) { int ai=a[i]-'0'; int ci=ai-carry; if(ci<0) { ci+=10; carry=1; } else carry=0; c+=(ci%10)+'0'; } int lenc=c.size(); for(i=c.size()-1;i>=0;i--) { if(c[i]=='0') lenc--; else break; } if(lenc==0) return ""; c=c.substr(0,lenc); return rev(c);}string divide(string a,string b){ int lena=a.size(); int lenb=b.size(); if(lena<lenb||(lena==lenb&&a<b)) return "0"; string bt[11]; bt[0]=""; bt[1]=b; for(int j=2;j<=10;j++)//除法的条件限制每一位的商不可能>=10 { bt[j]=add(bt[j-1],bt[1]); } int i=lenb-1; string c; string now=a.substr(0,lenb); if(now<b) { now+=a[++i];//除法相当于多次减法,这样表示++i程序更快 } for(;i<lena;i++) { int ci; int len_now=now.size(); for(ci=1;ci<=10;ci++) { int lbn=bt[ci].size(); if(lbn>len_now||(lbn==len_now&&bt[ci]>now)) break;//除不下去了就跳出循环 } ci--;//看有几个数能被减,因为ci时跳出循环,所以不算在内,需要减一 c+=ci+'0'; now=sub(now,bt[ci]); if(i<lena-1) { if(now.size()==0&&a[i+1]=='0') continue; now+=a[i+1]; } } return c;}int main(){ string a,b; cin>>a>>b; cout<<divide(a,b)<<endl;}
0 0
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- 高精度除法
- Eclipse RCP开发桌面程序
- Java Collection
- Android中Activity的切换
- Android service
- C++ COM编程之什么是组件
- 高精度除法
- new delete 是运算符,malloc,free是函数
- 《高效精准》敏感字&词过滤
- DIV嵌套时外层无法自适应高度三种解决方案
- Java利用json-tool操作json和java对象转换
- Python web 开发中的问题集锦
- SPOJ 7001 Visible Lattice Points(莫比乌斯反演)
- HDU 3220 IDA*搜索 || BFS
- Eclipse 程序界面美化技术