C++例题:大数运算---字符串相加(使用数字字符串来模拟竖式计算)

1.代码速览

class Solution2
{
public:string addStrings(string num1, string num2){//end1和end1是下标int end1 = num1.size() - 1;int end2 = num2.size() - 1;string str;//下标(指针)从后向前走,走到头才可以结束,所以是end>=0int next = 0;while (end1 >= 0 || end2 >= 0){int x1 = end1 >= 0 ? num1[end1--] - '0' : 0;//'0' = 48int x2 = end2 >= 0 ? num2[end2--] - '0' : 0;int x = x1 + x2 + next;//18          10next = x / 10;//18/10 = 1 进位     1x = x % 10;//18%10 = 8 本位        0//头插//str.insert(0, 1, x + '0');//将数子恢复成字符str += (x + '0');}if (next == 1)//处理头是9+1的情况{/*str.insert(str.begin(), '1');*/str += '1';}reverse(str.begin(), str.end());return str;}
};

2.代码详解

我举一个较为极端的例子来说明此代码的运行逻辑,这个例子也可更全面的概括了几乎所有的情况

"99"+'9':

2.1逐步骤分析

a.以竖式计算的逻辑,绝对是从个位开始相加,即'9'+'9',于是,我们便要想办法定位到这个位子,

于是我们便设置下标end1和end2来定位这两个字符串的最后一位(个位)

在C++的STL中,我们一般使用size()来计算当前容器中字符串的大小,num1.size()-1可以得出下标;

b.因为9+9=18,在竖式计算中,这里的18是需要留8进1的,于是我们便声明一个变量next来储存这个进位,并且将next初始化为0

结合手绘图,我们可以得出结论,在进行竖式计算的过程中,一个数字的得出其实由三个部分的相加组成,是x1+x2+next

c.这两个数字字符串的相加可以,首元素的下标为0,当end1和end2>=0时此循环才可以进行,在进行加法计算的过程中结果的x=x1+x2+next;x1和x2便是下标end1和end2目前所指向的数字,在end1和end2遍历完字符串中所有数字符字后循环方可停止

d.用end1和end2对两个字符串进行遍历

如果这个位置有字符,就将这个字符显示类型转换成int类型的数字

在c语言和C++中,字符实际上是以整数形式存储的,它们的值是它们对应的 ASCII 值,证明过程如下

所以这里使用显式类型转换和字符串(ASCII)相减得出int的整数(就是由字符数字转换成int型的数字)

e.在考虑好将单个位置上的数字相加工作做完以后我们便可以考虑进位数字的求得和本位数字的保留问题了

f.在将它的每个位置取下后将需要保留的位置依次放入字符串中形成新的数字,有两种方法,可以尾插然后使用reverse()倒一下,或者直接头插

这里建议尾插,如果头插那么时间复杂度将会是O(N²),如果尾插后reverse便是O(N);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/671522.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

添加自定义内容致远oa门户

修改门户内容 甲方需要再主页添加按钮,其实也是可以的,这个配置还不好搞,在后端进行了配置开发

微积分 --- 偏导数,方向导数与梯度(二)

方向导数 上图为一温度图,所反映的是加利福利亚洲和内华达州在十月的一天下午三点的温度。其中,图中的每一点都是温度T关于x,y的函数,即T(x,y)。对于图中的Reno市而言,沿着x方向的偏导反映的是温度沿着x方向,即沿着东方…

Docker 的网络实现

简介 标准的 Docker 支持以下 4 类网络模式: 1)host 模式:使用 --nethost 指定 2)container 模式:使用–netcontainer:NAME_or_ID 指定 3)none模式:使用 --netnone 指定 4)bridge 模…

19 内核开发-内核源码编译

19 内核开发-内核源码编译 (1)开始准备 安装好virtual box ubuntu 系统后,即可下载内核代码,进行编译 历史内核源码地址:https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/ 下载 linux-5.10.102.tar.gz 的包,可以使用wget 命令 创建编译目…

Java二维码、条码生成及解码工具类

功能描述 生成二维码、条码解码使用谷歌的zxing依赖 引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version> </dependency><dependency><groupId>…

帆软报表9.0连接达梦数据库

一、将驱动复制到帆软安装目录下 二、配置数据库连接 注意&#xff1a;dm.jdbc.driver.DmDriver是直接在文本框输入的 进行以上两部就能连接达梦数据库了

接口自动化测试之-requests模块详解

一、requests背景 Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池&#xff0c;支持使用cookie保持会话&#xff0c;支持文件上传&#xff0c;支持自动确定响应内容的编码&#xff0c;支持国际化的 URL 和 POST 数据自动编码。 二、requests安装 利用p…

(二)JSP教程——taglib指令

创建标签文件 首先创建一个Web项目&#xff0c;在webapp/WEB-INF目录下创建一个tags文件夹 在tags文件夹中创建一个oddNumberSum.tag文件&#xff0c;Tag文件时扩展名为.tag的文本文件&#xff0c;其结构和JSP文件非常相似&#xff0c;该文件的目录结构如图所示 创建Tag文件的…

SOLIDWORKS Electrical电气智能零部件的运用

电气2D向电气3D转型&#xff0c;3D模型无疑是重中之重&#xff0c;精准、正确的3D模型有利于电线长度、空间大小、耗材的计算。而线槽、导轨因为要根据实际情况裁剪&#xff0c;所以即使同一规格的线槽、导轨&#xff0c;在装配时也得根据实际情况&#xff0c;修改长度&#xf…

Adobe Illustrator 2024 for Mac:矢量图形设计软件

Adobe Illustrator 2024 for Mac是一款专为Mac用户设计的行业标准矢量图形设计软件。该软件以其卓越的性能和丰富的功能&#xff0c;为设计师和艺术家们提供了一个全新的创意空间。 作为一款矢量图形软件&#xff0c;Adobe Illustrator 2024 for Mac支持创建高质量的矢量图形&a…

视频改字祝福 豪车装X系统源码uniapp前端小程序源码

视频改字祝福 豪车装X系统源码uniapp前端小程序源码&#xff0c;创意无限&#xff01;AI视频改字祝福&#xff0c;豪车装X系统源码开源&#xff0c;打造个性化祝 福视频不再难&#xff01; 想要为你的朋友或家人送上一份特别的祝福&#xff0c;让他们感受到你的真诚与关怀吗&am…

虚拟键代码

虚拟键代码 虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn 在Windows操作系统中&#xff0c;虚拟键代码&#xff08;Virtual-Key Codes&#xff09;是一组用来表示键盘上按键的数值。这些代码通常用于Windows API函数&#xff0c;以便程序能够识别和处理键盘输入。 虚拟…