两个用字符串表示的大数字的和

本文介绍了如何在Java和Python中实现两个大数字符串的求和。通过从尾到头遍历字符串,逐位相加并处理进位,最后构建结果。Java中利用ASCII码转换字符为数字,Python则直接将字符串元素转换为整数。
摘要由CSDN通过智能技术生成


这是遇到的一道快手数仓岗位的面试题目,题目大意如下:

题目详情

现在有两个用字符串表示的数字,例如num1=“9999933332232”,num2=“999999425262”,问题是请你对两个数字求和,即求num1+num2

Java实现

分析

这里给出我的一种思路,如果有不一样的方法,请指教一下,不胜感激。
1、新建一个StringBuilder,存储计算后返回的数字结果
2、从尾到头遍历两个字符串的数字,相加计算进位和当前位置的值
3、上面计算完之后,判断进位是否为1,是则将给StringBuilder对象再append1,否则不做操作

Java 怎么获取到字符串中的对应位置的数字值

本题涉及的一个转换字符值到对应数字值,可能是一个难点。
在java中我们通过num1.charAt(length1)可以获得对应位置字符的ascII码值,但是我们需要的是数字值,才能用于计算,其实也很简单,但是不知道的时候就有点麻烦。

使用字符ascII码值的运算:num1.charAt(length1) - ‘0’ 返回对应位置的数字值,解决问题了。

Java完整代码

代码中有详细的注释,实现过程主要是入上述分析。

public static String BigDataAdd(String num1, String num2) {
        int length1 = num1.length() - 1;  // 方便下面索引取值,因此减1
        int length2 = num2.length() - 1;
        int carry = 0;
        StringBuilder sb = new StringBuilder();

        while (length1 >= 0 || length2 >= 0) {

            int a = (length1 >= 0)? num1.charAt(length1) - '0' : 0;  // 将asc码值计算转成数字值
            int b = (length2 >= 0)? num2.charAt(length2) - '0' : 0;

            int sum = a + b + carry;
            carry = sum / 10;  // 进位
            sb.append(sum % 10);
            length1--;
            length2--;
        }

        if (carry == 1) {  // 有进位
            sb.append(1);
        }

        sb.reverse();
        return sb.toString();
    }

测试验证

public static void main(String[] args) {
        System.out.println(BigDataAdd("9999933332232", "999999425262"));
    }

在这里插入图片描述

public static void main(String[] args) {
        System.out.println(BigDataAdd("9999933332232", "425262"));
    }

在这里插入图片描述

python实现

python 怎么获取到字符串中的对应位置的数字值

在python中获取对应位置的值更加容易。python中的字符串可以看做一个字符数组,直接能取值,然后再强转成int类型就可以嘞
int(num1[l1]) 即可获取到指定位置的数字值,是不是更加简单,python的完整实现,见下面代码

python完整代码

def bigDataAdd(num1, num2):
    l1 = len(num1) - 1
    l2 = len(num2) - 1
    carry = 0
    sb = []

    while l1 >= 0 or l2 >= 0:
        a = int(num1[l1])
        b = int(num2[l2])
        sum = a + b + carry
        carry = sum // 10
        sb.append(sum % 10)
        l1 -= 1
        l2 -= 1

    if carry == 1:
        sb.append(1)

    sb.reverse()

    result = ""
    for i in sb:
        result += str(i)
    return result

总结

这应该也是一道比较简单的面试题,我当时没有处理好的就是怎么获取到字符串中的数字值,就放在这里记录一下吧。顺便如果有不一样的方法,也希望能交流一下,不胜感激。

ps:计划每日更新一篇博客,今日2023-05-18,日更第三十二天。
昨日更新:

leetcode 不同路径详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值