基础算法----高精度
写在前面
应用了vector头文件
#include<vector>
vector基本操作:
(1)头文件#include
(2)创建vector对象,vector
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector
最大值:
int max = *max_element(v.begin(),v.end());
最小值:
int min = *min_element(v.begin(),v.end());
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl;
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小:vec.size();
(9)清空:vec.clear();
可用auto类型自动接收结果
对数据的读入
int main(){
vector<int> A,B;
string a,b;
cin>>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');
}
高精度加法模板
vector<int> add(vector<int> &A,vector<int> &B){
int t = 0;
vector<int> C;
for(int i = 0;i < A.size()||i < B.size(); i ++ ){
if( i < A.size() ) t += A[i];
if( i < B.size() ) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if(t) C.push_back(1);
return C;
}
高精度减法模板
//比较大小if(cmp(A,B)) -> sub(A,B) else -> sub(B,A) + cout<<'-';
bool cmp(vector<int> &A,vector<int> &B){
if(A.size() != B.size()) return A.size() > B.size();
for(int i = A.size() - 1 ;i >= 0;i --){
if(A[i] != B[i]) return A[i] > B[i];
}
return true;
}
//做减法
vector<int> sub(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;
}
while(C.size() > 1&&C.back() == 0) C.pop_back();
return C;
}
高精度乘法模板
需要注意乘法运算的b不是高精度数。
vector<int> mul(vector<int> &A,int b){
int t = 0;
vector<int> C;
for(int i = 0;i < A.size(); i ++){
t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
if(t > 0) C.push_back(t);
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
高精度除法模板
是除以低精度
使用了reverse所以要包含头文件
vector<int> div(vector<int> &A,int b ,int &r){
r = 0;
vector<int> C;
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;
}