字符串型的数字相加减_LeetCode基础算法题第177篇:数字字符串加法

a5ebd2a382306e9843b0ea00ebc51b58.png

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。

如果有任何问题可以在文章后评论或者私信给我。

如果有朋友希望我讲些其他话题,请在评论区留言或者私信给我。

持续分享,敬请关注。


LeetCode 415. 数字字符串加法(Add Strings)

问题描述:

给定两个整数的字符串形式num1和num2, 返回 num1+num2的结果的字符串形式。

注:

  1. num1和num2的长度都小于5100;
  2. num1和num2只包含数字0-9;
  3. num1和num2不包含任何前导零;
  4. 不使用任何内置的BigInteger库不要将输入直接转换为整数;

C语言实现:

这个问题很简单。

传统的解决思路是用ASCII码。说实话我也没什么太好的办法。

首先定义一个字符数组res用来保存结果,长度是strlen(num1)+2,因为strlen的返回值是不包括'0'的,但是我们要考虑,此外因为加法存在进位问题,比如9+1=10,即结果可能比num1或num2多一位。

定义整型变量carry用来保存加的过程中某一步的进位值,没有进位的化,它的值是0,否则是1。

我们从右向左同时遍历num1和num2:

同一位相加再加上carry,注意因为是字符,所以结果还要与字符'0'取余,这样得到的结果我们记为s,s就是这一位相加的整数结果。但是我们在res中保存的同然是数值字符,所以我们要对s做进一步处理:

  • s%10就是加后的除去进位后,这一位留下的数字,我们要将其转化成字符,仅仅需要再加上'0'即可。
  • s/10就是是否进位的结果,如果s大于等于10,说明有进位,那么结果就是1,否则是0。将其保存到carry中,我们知道下一位的计算中会用到。

如此下去,直到遍历结束。

如果这个时候carry的值为0,说明num1加num2的结果得到的数字长度和num1或num2一致,那么到这里计算结束了,由于我们申请res的长度,多申请了一位,那么返回结果应该是res+1。

如果这个时候carry的值为1,说明最后有进位,需要将res[0]赋值为'1',然后返回res。

最后代码如下:

c00cf7ba0317b29e4421c87df48c1e0e.png
f1af23fe3ee79eab83d91408c949d357.png

Java语言实现:

Java 的实现和C语言的实现一致,不再撰述。

代码如下:

d265d83606228050a5b613430a3eaed3.png
58855fe75a9cf5230331c4e89a0f5ade.png

Python语言实现:

Python 的实现思路和C语言的基本一致,不再撰述。

代码如下:

8915a075f8548fd4da533caaa37b2cd7.png
545d6fdaf3402c95e8d53bbee3b7677e.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值