【C++提高】高精度加法
前言
一天,你在洛谷开心的刷着算法题,突然见到这么一道题。p1601
你不可置信居然有这么简单的题……可一看难度……
居然有普及-!!!(其实也不是很高^~^)
但你还是满怀信心的写出了如下代码。
#include<bits/stdc++.h> using namespace std; int main(){ int a,b; cin>>a>>b; cout<<a+b; return 0; }可你发现提交后只有40分☻
可之后你看到了这些
你很疑惑然后你打开了一个名叫皓月斯语的博客并打开了这篇文章^~^.
高精度加法详解
你可以把高精度想象成一个竖式的计算过程
我的代码如下
#include<bits/stdc++.h> using namespace std; string jiafa(string s1,string s2){ reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end()); int jw=0; int size=max(s1.size(),s2.size()); string re=""; for(int i=0;i<size;i++){ // int t1=i>=s1.size()?0:s1[i]-'0'; int t1; if(i>=s1.size()){ t1=0; } else{ t1=s1[i]-'0'; } int t2; if(i>=s2.size()){ t2=0; } else{ t2=s2[i]-'0'; } int r=t1+t2+jw; if(r>=10){ jw=1; r%=10; } else{ jw=0; } re+=(r+'0'); } if(jw==1){ re+='1'; } reverse(re.begin(),re.end()); return re; } string s1,s2; int main(){ cin>>s1>>s2; cout<<jiafa(s1,s2); return 0; }1. 函数声明和参数
string jiafa(string s1,string s2){定义了一个名为jiafa的函数,接收两个字符串参数s1和s2,返回一个字符串。字符串用来表示大整数,因为 C++ 的int或long long无法存储非常大的数字。
2. 反转字符串
reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end());将两个输入字符串反转。这是因为我们做加法时要从最低位(个位)开始计算,而字符串存储数字时最高位在左边。反转后,s1[0]就是原来的个位,方便逐位相加。
3. 初始化变量
int jw=0; int size=max(s1.size(),s2.size()); string re="";jw:进位标志,初始为 0。size:取两个字符串长度的最大值,确保循环能处理较长的数字。re:结果字符串,初始为空。
4. 逐位相加循环
for(int i=0;i<size;i++){循环size次,处理每一位。
5. 获取当前位的数字
//int t1=i>=s1.size()?0:s1[i]-'0'; int t1; if(i>=s1.size()){ t1=0; } else{ t1=s1[i]-'0'; } int t2; if(i>=s2.size()){ t2=0; } else{ t2=s2[i]-'0'; }这里用条件判断来处理两个数字位数不同的情况:
- 如果当前下标
i已经超过了字符串长度,说明这一位不存在,就当作 0。 - 否则,将字符转换为数字:
s1[i]-'0'。
注释掉的那行// int t1=i>=s1.size()?0:s1[i]-'0';是三目运算符的写法,功能相同。
6. 计算当前位结果和进位
int r=t1+t2+jw; if(r>=10){ jw=1; r%=10; } else{ jw=0; } re+=(r+'0');r:当前位的和(两个数字当前位 + 上一位的进位)。- 如果
r >= 10,需要进位:jw=1,并且当前位只保留个位(r%=10)。 - 否则,进位为 0。
- 将当前位的数字(0-9)转换为字符并追加到结果字符串
re末尾。
7. 处理最高位进位
if(jw==1){ re+='1'; }循环结束后,如果还有进位(jw==1),需要在结果字符串末尾追加 '1'(因为这是最高位的进位)。
8. 反转结果并返回
reverse(re.begin(),re.end()); return re;由于我们是从低位开始计算的,re中存储的是反序的结果(个位在最前)。所以需要再次反转,得到正常的高位在前的数字字符串,然后返回。
9. 主函数
string s1,s2; int main(){ cin>>s1>>s2; cout<<jiafa(s1,s2); return 0; }主函数很简单:读入两个字符串,调用jiafa函数计算它们的和,然后输出结果。
结尾
当你拿出新学习的算法去做着到题时……
恭喜你学会了一个新的算法。
