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