加法高精对低精
vector<int> add(vector<int > A,int b){
vector<int >c;
for(int i=A.size()-1;i>=0||b;--i){
if(i<A.size()) b+=A[i];
c.push_back(b%10);
b/=10;
}
reverse(c.begin(),c.end());
return c;
}
加法高精对高精
vector<int> add(vector<int> A,vector<int> B){
vector<int>C;
reverse(A.begin(),A.end());
reverse(B.begin(),B.end());
for(int i=0,t=0;i<A.size()||i<B.size()||t;++i){
int a=(i<A.size())?A[i]:0,b=(i<B.size())?B[i]:0;
t+=a+b;
C.push_back(t%10);
t/=10;
}
reverse(C.begin(),C.end());
return C;
}
减法高精对低精
vector<int> sub(vector<int> A,int b){
vector<int> C;
A[A.size()-1]-=b;
for(int i=A.size()-1;i>=0;--i){
while(A[i]<0){
A[i]+=10;
A[i-1] -=1;
}
C.push_back(A[i]);
}
while(C.size()>1&&C.back()==0) C.pop_back();
reverse(C.begin(),C.end());
return C;
}
减法高精度对高精度
vector<int> sub(vector<int> A,vector<int> B){
vector<int>C;
reverse(A.begin(),A.end());
reverse(B.begin(),B.end());
for(int i=0;i<A.size()||i<B.size();++i){
int a=(i<A.size())?A[i]:0,b=(i<B.size())?B[i]:0;
if(a<b) a+=10,A[i+1]-=1;
C.push_back(a-b);
}
while(C.size()>1&&C.back()==0) C.pop_back();
reverse(C.begin(),C.end());
return C;
}
乘法高精度对低精度
vector<int> div(vector<int > A,int b,int &r){
vector<int>c;
r = 0;
for(int i=0;i<A.size();++i){
r = r*10+A[i];
c.push_back(r/b);
r%=b;
}
while(c.size()>1&&c.front() == 0) c.erase(c.begin(),c.begin()+1);
return c;
}
乘法高精度对高精度
vector<int> mul(vector<int> A,vector<int> B){
vector<int>C((A.size()+1)*(B.size()+1),0);
reverse(A.begin(),A.end());
reverse(B.begin(),B.end());
for(int i=0,as=0;i<A.size();++i){
for(int j=0;j<B.size()||as!=0;++j){
C[i+j]+=A[i]*B[j]+as;
as=C[i+j]/10;
C[i+j]%=10;
}
}
while(C.size()>1&&C.back()==0) C.pop_back();
reverse(C.begin(),C.end());
return C;
}
除法高精度对低精度
vector<int> div(vector<int > A,int b,int &r){
vector<int>c;
r = 0;
for(int i=0;i<A.size();++i){
r = r*10+A[i];
c.push_back(r/b);
r%=b;
}
while(c.size()>1&&c.front() == 0) c.erase(c.begin(),c.begin()+1);
return c;
}
除法高精度对高精度
bool judge(vector<int> A,vector<int> B){
if(A.size()>B.size()) return 1;
if(A.size()<B.size()) return 0;
for(int i=0;i<A.size();++i){
if(A[i]>B[i]) return 1;
if(A[i]<B[i]) return 0;
}
return 1;
}
vector<int> div(vector<int>&A,vector<int>B){
vector<int>C,D(1,1);
while(judge(A,B)){
A=sub(A,B);
C=add(C,D);
}
return C;
}