(5)高精度算法

tech2024-11-15  16

Ⅰ.高精度加法

string add(string p,string q) { reverse(p.begin(),p.end()); reverse(q.begin(),q.end()); if(p.size()<q.size()) swap(p,q); while(q.size()<p.size()) q+='0'; for(int i=0; i<p.size(); i++) p[i]+=q[i]-'0'*2; for(int i=0; i<p.size()-1; i++)//进位 if(p[i]>=10) { p[i+1]++; p[i]%=10; } if(p.back()>=10)//C11 { p.back()%=10; p+=1; } for(int i=0; i<p.size(); i++) p[i]+='0'; reverse(p.begin(),p.end()); return p; }

Ⅱ.高精度乘法

string mul(string p,string q) { string ans; int i,j,pl=p.size(),ql=q.size(),eps=pl+ql; reverse(p.begin(),p.end()); reverse(q.begin(),q.end()); int a[pl],b[ql],c[eps];//动态数组 memset(c,0,sizeof c); for(i=0;i<pl;i++)//初始化a数组 a[i]=p[i]-'0'; for(i=0;i<ql;i++)//初始化b数组 b[i]=q[i]-'0'; for(i=0;i<pl;i++)//初始化c数组 for(j=0;j<ql;j++) c[i+j]+=a[i]*b[j]; for(i=0;i<eps;i++) if(c[i]>=10) { c[i+1]+=c[i]/10; c[i]%=10; } for(i=eps-1;i>0;i--)//注意范围,乘积至少保留一位 if(c[i] != 0) break; for(;i>=0;i--) ans+=c[i]+'0';//ans不用reverse return ans; }

Ⅲ.高精度减法

string subtract(string p,string q) { //默认是大数减小数 /*if(p.size()<q.size() or (p.size()==q.size() and p<q)) swap(p,q);*/ reverse(p.begin(),p.end()); reverse(q.begin(),q.end()); while(q.size()<p.size()) q+='0'; for(int i=0; i<p.size(); i++) { if(p[i]<q[i]) { p[i+1]--; p[i]+=10; } p[i]=p[i]-q[i]+'0'; } while(p.back()=='0' and p.size()>1) p.pop_back(); reverse(p.begin(),p.end()); return p; }

Ⅵ.高精度除法(需要高精乘法和加法)

string div2(string n)//求平均数 { string ans; for(int i=0; i<n.size(); i++) { int t=n[i]-'0'; if(!(t%2)) ans+=t/2+'0'; else { ans+=t/2+'0'; if(i!=n.size()-1) n[i+1]+=10; } } while(*ans.begin()=='0' and ans.size()>1)//去前导0 ans.erase(0,1); return ans; } bool cmp(string p,string q)//返回p<q? { if(p.size()!=q.size()) return p.size()<q.size(); else return p<q; } string div(string p,string q) { string m,r=p,l="0"; while(cmp(l,r)) { m=div2(add(l,r)); if(check(m,p,q)) return m; else if(cmp(mul(q,m),p)) l=add(m,"1"); else r=subtract(m,"1"); } return m; }

 

最新回复(0)