一.高精度加法模板
1.模板
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;
}
2.模板讲解
上面模板是C++实现的一个高精度加法函数,让我们先了解一下什么是高精度加法。
高精度加法是一种用于处理非常大的整数运算的方法。在计算机科学中,由于计算机的内存限制,我们不能直接存储非常大的整数。所以,我们需要把大整数分解成多个部分(例如,每一位数字),然后单独处理这些部分。
这个函数的参数是两个vector<int>类型的数组A和B,它们分别代表两个要相加的整数。结果C被存储在一个新的vector<int>中。模板里运用的是c++ STL容器vector(这里就不过多讲解vector,详见可以去其他博客搜索),vector不用担心空间问题,可以自动扩容,比较方便。
函数的实现中,`t`用于存储当前位的和,`A[i]`和`B[i]`分别代表A和B的第i位。如果A或B超出其范围,那么其对应的值就是0。 循环的条件是`i<A.size() || i<B.size()`,这意味着A或B数组都结束,循环都会停止。
对于每个位,我们将`A[i]`和`B[i]`加到`t`上,然后对结果取模10,并将结果加到`C`上。这一步是为了处理进位和计算当前位的值。 最后,如果`t`的值大于0(即存在进位),我们将1添加到`C`的末尾。 这就是高精度加法的基本思想。
另外,这里A和B都是逆序输入,因为有进位,要添加一位(倒序容易实现进位),所以输入和结果要倒序输入或者输出。
看完模板后,快来进入习题练练手吧!
二.习题一
1.题目来源
2.题目描述
3.题目讲解
模板题,注意要倒序输入和输出即可。
auto是适配器,自动选择合适的类型,这里C为vector类型。
4.完整代码
#include<bits/stdc++.h>
using namespace std;
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;
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;
}
三.习题二
1.题目来源
P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
2.题目描述
3.题目讲解
模板题,注意要倒序输入和输出即可。
auto是适配器,自动选择合适的类型,这里C为vector类型。
4.完整代码
#include<bits/stdc++.h>
using namespace std;
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;
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;
}
经过上面两道练习,相信大家已经对此模板熟悉了一些了吧。
算法要勤加练习,快多多去练习吧!
希望大家给作者大大一个赞吧,感谢大家观看。
此模板来源:常用代码模板1——基础算法 - AcWing