当前位置: 首页 > news >正文

【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函数计算它们的和,然后输出结果。

结尾

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

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

http://www.jsqmd.com/news/1196642/

相关文章:

  • 基于西门子PLC的智能物流/快递分类设计1112(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 基于PLC的四层电梯自动控制系统设计13(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 北京欧米茄回收价格查询和靠谱回收平台实测排行(2026年7月最新数据) - 天价名表回收平台
  • 从零到一:深入理解ASCII码在C语言中的核心应用
  • 利用MATLAB深度学习工具箱实现CNN图像分类:从数据准备到模型评估全流程解析
  • 电线电缆选购指南:金环宇ZC-BVR4平方多股软线实测解析
  • 长沙浏阳市适老化改造|维小达|适老厨房、卫生间、卧室改造、全屋无障碍改造、适老定制、老旧小区居家商用一站式适老化设计施工养护服务 - 一点传媒
  • 基于RF430CL331H的动态NFC标签设计:从硬件到软件实战指南
  • Flink SQL Client实战:从零配置到流式SQL任务一键提交集群
  • 南京宝珀回收价格查询和靠谱回收平台实测排行(2026年7月最新) - 嘉价奢侈品回收平台
  • 汽车DLP HUD系统管理芯片TPS99000S-Q1深度解析与设计实践
  • 无源无感·合规可控:镜像视界跨镜无缝接力,筑牢涉密军工安防绝对防线专项技术白皮书 · 军工涉密专属版
  • 停止序列不生效?ChatGPT响应截断异常诊断手册,含curl/postman/Python SDK三端验证清单,限时开源
  • 从选型到焊接:阻容封装尺寸速查与实战应用指南
  • 基于plc的物料分拣1112(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 计算机毕业设计之基于springBoot和vue的篮球比赛管理系统
  • 为什么黑客宁愿教你技术,也不愿意直接帮你!
  • 《命若琴弦》读后感:在虚无中寻找意义,于绝境中奏响生命之歌
  • PX4无人机 - 从键盘控制到Offboard模式实战解析
  • ROS2大型项目启动架构:Launch分层设计与参数治理实战
  • MQTT与MQ:从协议到平台,如何为你的项目选择正确的消息传递方案
  • 深圳卡板定制厂家排行:合规性与定制能力实测对比 - 互联网科技品牌测评
  • 能独立开发AI智能体的供应商盘点:自研模型是分水岭 - 科技焦点
  • 真实事件影视改编技术方案:从剧本数字化到后期制作全流程
  • 位置式PID与增量式PID的代码实现与电机控制实战
  • K8s PV 动态供给的陷阱:StorageClass 参数配错后的连锁反应
  • 数学符号“s.t.”的意义
  • 从__len__()魔法方法出发:深入理解Python len()函数的类型限制与自定义扩展
  • 使用 Lottie 与 Rive 构建跨端动效的架构选型与性能分析
  • 【AI智能客服】三模知识引擎:文档+FAQ+图谱的融合检索革命