news 2026/7/15 23:24:05

【C++提高】高精度加法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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的函数,接收两个字符串参数s1s2,返回一个字符串。字符串用来表示大整数,因为 C++ 的intlong 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函数计算它们的和,然后输出结果。

结尾

当你拿出新学习的算法去做着到题时……

恭喜你学会了一个新的算法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 23:21:21

COST231-WI模型参数解析与MATLAB仿真实践

1. COST231-WI模型入门&#xff1a;从物理参数到路径损耗第一次接触COST231-WI模型时&#xff0c;我被那一堆参数搞得头晕眼花——建筑物高度、街道宽度、信号入射角...这些看似普通的建筑参数&#xff0c;竟然能直接影响手机信号的强弱&#xff1f;后来在实际项目中调试城市微…

作者头像 李华
网站建设 2026/7/15 23:13:45

AI语音合成技术演进:从Tacotron到端到端神经网络声码器

AI语音合成技术演进&#xff1a;从Tacotron到端到端神经网络声码器语音合成&#xff08;Text-to-Speech, TTS&#xff09;技术正在经历从拼接合成到参数合成&#xff0c;再到端到端神经网络生成的范式转变。现代TTS系统能够生成媲美真人的自然语音&#xff0c;支持多说话人、多…

作者头像 李华
网站建设 2026/7/15 23:05:25

从教育焦虑到个性化学习:破解孩子学习动力的密码

1. 从“催命符”到成长阶梯&#xff1a;理解教育焦虑背后的真实诉求“知道朱尼尔拿的是书&#xff0c;不知道的以为他拿的是催命符”——这句网络热梗精准戳中了当代家长的教育焦虑。表面看是调侃孩子对学习的抗拒&#xff0c;深层反映的却是家庭教育中普遍存在的压力传递现象。…

作者头像 李华
网站建设 2026/7/15 23:05:22

从选型到焊接:阻容封装尺寸速查与实战应用指南

1. 阻容封装尺寸入门&#xff1a;为什么0201和0402不只是数字第一次接触电阻电容的封装尺寸时&#xff0c;我也被那些数字搞晕过——0201、0402、0603&#xff0c;看起来像某种密码。直到有次手工焊接时错把0603当成0402&#xff0c;烙铁头压下去的瞬间&#xff0c;那个比芝麻还…

作者头像 李华
网站建设 2026/7/15 23:05:21

K8s PV 动态供给的陷阱:StorageClass 参数配错后的连锁反应

K8s PV 动态供给的陷阱&#xff1a;StorageClass 参数配错后的连锁反应 一、一个 StorageClass 的 reclaimPolicy: Delete 差点让整个数据库没了 故事很简单&#xff1a;运维创建了一个 MySQL StatefulSet&#xff0c;PVC 使用默认 StorageClass&#xff0c;一切正常。三个月…

作者头像 李华
网站建设 2026/7/15 23:05:06

智能技术架构文档自动生成:保持文档与代码同步

智能技术架构文档自动生成&#xff1a;保持文档与代码同步 大家好&#xff0c;我是蔓蔓。做独立产品最大的感受之一是&#xff1a;文档永远是滞后于代码的。每次重构完一个模块&#xff0c;就面临更新 README、API 文档、架构图的庞大工作量。更糟糕的是&#xff0c;过三个月回…

作者头像 李华