高精度算法
Posted kstranger
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度算法相关的知识,希望对你有一定的参考价值。
复习一下高精度:
高精度加法:
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; vector<int> add(vector<int> a,vector<int> b){ vector<int> res; int i=0,j=0; int t=0; while(i<a.size()&&j<b.size()){ t+=(a[i]+b[i]); res.push_back(t%10); t/=10; i++; j++; } while(i<a.size()){ t+=a[i]; res.push_back(t%10); t/=10; i++; } while(j<b.size()){ t+=b[i]; res.push_back(t%10); t/=10; j++; } while(t){ res.push_back(t%10); t/=10; } reverse(res.begin(),res.end()); return res; } int main(){ string a; string b; cin>>a>>b; vector<int> A,B; for(int i=a.size()-1;i>=0;i--){ A.push_back(a[i]-‘0‘); } for(int j=b.size()-1;j>=0;j--){ B.push_back(b[j]-‘0‘); } vector<int> c=add(A,B); for(int i=0;i<c.size();i++){ cout<<c[i]; } cout<<endl; }
高精度减法:
#include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; vector<int> sub(vector<int> a,vector<int> b){ //a>b那么a一定不会小于b的位数 vector<int> c; int t=0; int i=0; for(;i<b.size();i++){ t=a[i]-t; t-=b[i]; c.push_back((t+10)%10); if(t<0)t=1; else t=0; } while(i<a.size()){ t=a[i]-t; c.push_back((t+10)%10); if(t<0)t=1; else t=0; i++; } int n=c.size()-1; for(int j=n;j>=0;j--){ if(c[j]>0)break; c.pop_back(); } reverse(c.begin(),c.end()); return c; } bool cmp(vector<int> a,vector<int> b){ if(a.size()>b.size())return true; if(b.size()>a.size())return false; for(int i=a.size()-1;i>=0;i--){ if(a[i]>b[i])return true; if(b[i]>a[i])return false; } return true; } int main(){ string a,b; cin>>a>>b; vector<int>A,B; for(int i=a.size()-1;i>=0;i--){ A.push_back(a[i]-‘0‘); } for(int i=b.size()-1;i>=0;i--){ B.push_back(b[i]-‘0‘); } if(cmp(A,B)){ vector<int> c=sub(A,B); if(c.size()==0){ cout<<0<<endl; return 0; } for(int i=0;i<c.size();i++){ cout<<c[i]; } cout<<endl; } else { vector<int> c=sub(B,A); cout<<‘-‘; for(int i=0;i<c.size();i++){ cout<<c[i]; } cout<<endl; } }
高精度乘法:
#include <iostream> #include <algorithm> #include <vector> #include <cstring> #include <string> #include <vector> using namespace std; vector<int> mul(vector<int> A,int b){ vector<int> C; int t=0; for(int i=0;i<A.size();i++){ t+=(A[i]*b); C.push_back(t%10); t/=10; } while(t){ C.push_back(t%10); t/=10; } reverse(C.begin(),C.end()); return C; } int main(){ string a; int b; cin>>a>>b; vector<int> A; for(int i=a.size()-1;i>=0;i--){ A.push_back(a[i]-‘0‘); } vector<int> C=mul(A,b); for(int i=0;i<C.size();i++){ cout<<C[i]; } cout<<endl; }
高精度除法:
#include <iostream> #include <algorithm> #include <string> #include <vector> using namespace std; vector<int> divv(vector<int> a,int b,int &r){ //从高位向低位除模拟余数 vector<int> c; r=0; bool flag=true; //用来判断是不是有前导零 for(int i=0;i<a.size();i++){ r=r*10+a[i]; if(r/b==0&&flag){ r%=b; continue; } c.push_back(r/b); flag=false; r%=b; } return c; } int main(){ string a; int b; cin>>a; cin>>b; vector<int>A; for(int i=0;i<a.size();i++){ A.push_back(a[i]-‘0‘); } int r; vector<int> c=divv(A,b,r); for(int i=0;i<c.size();i++){ cout<<c[i]; } cout<<endl; cout<<r<<endl: }
总结:
高精度其实是每一位的计算方法的一个模拟
加法就是每一位相加,然后判断进位再继续加
减法首先判断大小,然后每一位相减模拟借位
乘法每一位相乘处理进位
除法首先模拟每一次的余数,高位向低位进行
以上是关于高精度算法的主要内容,如果未能解决你的问题,请参考以下文章
有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]