C++高精度算法刷题模板
加法
//编写一个函数,传入2个vector
vector<int> add(vector<int> a,vector<int> b){
if(a.size()<b.size())return add(b,a);
vector<int> C;
int t=0;//t作为中间变量,通过t来完成进位
for(int i=0l;i<a.size();i++){
t+=a[i];
if(i<b.size())t+=b[i];
C.push_back(t%10);
t/=10;
}
if(t)C.push_back(t);
return C;
}
减法
//
vector<int> jian(vector<int> &a, vector<int> &b){
vector<int> C;
for(int i=0,t=0;i < a.size();i++){
t=a[i]-t;
if(i < b.size() )t-=b[i];
//进位的关键;把负数和正数一起处理
C.push_back((t+10)%10);
if(t<0)t=1;
else t=0;
}
//把尾0消去;
while(C.size()>1&&C.back()==0)C.pop_back();
return C;
}
//传入参数的时候要比较一下两个数,保证传入的a大于b
//比较模板
bool cmp(vector<int> a,vector<int> b){
if(a.size()!=b.size())return a.size()>b.size();
//下面是a和b长度相等的比较大小//从高位开始比较
for(int i=a.size()-1;i>=0 ;i--){
if(a[i]!=b[i])return a[i]>b[i];
}
return true;
}
乘法
//高精度乘以低精度
vector<int> mul(vector<int> x1, int b){
vector<int> C;
int t=0;
for(int i=0;i<x1.size()||t;i++){
if(i<x1.size())t+=x1[i]*b;
C.push_back(t%10);
t=t/10;
}
while(C.size()>1&&C.back()==0)C.pop_back();//考虑乘以0的特殊情况
return C;
}
除法
//高精度除以低精度
因为只能返回一个参数,所以这里的r要用地址传入
r表示余数,如果除不尽,会有余数
vector<int> div(vector<int> A, int b, int &r){
vector<int> C;
r=0;
for(int i=A.size()-1;i>=0;i--){
r=r*10+A[i];
C.push_back(r/b);
r%=b;
}
reverse(C.begin(),C.end());
while(C.size()>1&&C.back()==0)C.pop_back();
return C;
}