首先可以了解一下 c++ vector 使用方法
基本操作
(1)头文件#include<vector>
.
(2)创建vector对象,vector<int> vec
;
(3)尾部插入数字:vec.push_back(a)
;
(4)使用下标访问元素,cout<<vec[0]<<endl
;记住下标是从0开始的。
(5)向量大小: vec.size()
;
思路:
- 大整数在c++中的存储方法:将每一位存到数组里面去,注意是倒叙存储,即个位在下标为0处,高位存到下标大的位置,以此类推。因为加法考虑到进位,需要在高位上补上一个数,而在数组的末尾补上一个数是最容易的,因此采用倒叙存储。
- 运算:模拟人工加法的过程,如结果的十位=两个数的十位+上一位的进位
题目:
代码:
#include<iostream>
#include<vector>
using namespace std;
//C=A+B
vector<int> add(vector<int> &A,vector<int> &B){ //加上引用提高速率
vector<int> C;
int t=0; //进位
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;
}
int main(){
string a,b;
vector<int> A,B;
cin>>a>>b; //如a="123456"
//将大整数用数组存下来(逆序)
for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0'); //将字母变为数字要减去一个'0'
for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
auto C=add(A,B); //auto编译器自己推断类型,等价于vector<int> C
//逆序输出
for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
return 0;
}
另一个模板稍有些改变,只是加了一个判断
#include<iostream>
#include<vector>
using namespace std;
vector<int> add(vector<int> &A,vector<int> &B){
vector<int> C;
//判断
if(A.size()<B.size())return add(B,A);
int t=0;
for(int i=0;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(1);
return C;
}
int main(){
string a,b;
vector<int> 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');
auto C=add(A,B);
for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
return 0;
}
有关算法竞赛的题目会继续更新,欢迎评论交流!