求解大数加法思路和详解

题目来源:

本题目是来自牛客网的在线编程题目:详情请见下面链接:

牛客网大数加法

以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
(字符串长度不大于100000,保证字符串仅由’0’~'9’这10种字符组成)

易错点注意:

当我们看到这个题目,需要仔细分析题目,惯性会想到,将两个字符串转换成数字,然后相加,最后又返回字符串不就好了嘛!
但是问题是大数相加,存在int,long都放不下的问题,所以本题没有那么简单

如下:


public class Solution1 {
    public String solve(String s, String t) {
        // write code here
        int r = Integer.parseInt(s) + Integer.parseInt(t);
        return String.valueOf(r);
    }

    public static void main(String[] args) {

        Solution1 s = new Solution1();
        String ret = s.solve("99", "10");
        System.out.println(ret);
    }
}

虽然在处理小的数据的时候结果是对的,但当int,long都放不下的时候,相加,就出错了。

题目分析

当我们仔细分析题目,可以从以下步骤去解题:

  1. 将字符串转换成字符数组

    我们可以利用toCharArray(); 去将字符串转换为字符数组

  2. 将字符数组转换成int型数组
    通过字符减去‘0’,得到其具体数字

  3. 将int型数组逆置

  4. 相加,注意有进位的问题

  5. 将数组逆置

  6. 转换成字符串

注意:
我们还需要注意两个字符串,当其中有一个0,或者两个都是0的情况
所以,当其中一个为0,直接返回另外一个。是用来equals比较。

		if (s.equals("0")) {
            return t;
        }

具体实现

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     *
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve(String s, String t) {
        // write code here
        //0.判断是否有0相加
        if (s.equals("0")) {
            return t;
        }
        //1.将字符串转换成字符数组
        char[] a = s.toCharArray();
        char[] b = t.toCharArray();
        //2.转换成int数组
        int[] a1 = toIntArr(a);
        int[] b1 = toIntArr(b);
        //3.逆置数组
        int[] aInt = reverse(a1);
        int[] bInt = reverse(b1);
        int max = Math.max(aInt.length, bInt.length);
        int min = Math.min(aInt.length, bInt.length);
        int[] array = new int[max + 1];
        //4.相加
        //公共的
        int carry = 0;
        int i;
        for (i = 0; i < min; i++) {
            int r = aInt[i] + bInt[i] + carry;
            array[i] = r % 10;
            carry = r / 10;
        }
        //找到最长的数组
        int[] arrMax = aInt;
        if (aInt.length < bInt.length) {
            arrMax = bInt;
        }
        //非公共的
        for (; i < max; i++) {
            int r = arrMax[i] + carry;
            array[i] = r % 10;
            carry = r / 10;
        }
        //最后的进位
        array[max] = carry;

        //5.将数组逆置
        int[] arrayInt = reverse(array);
        //数组转字符串
        char[] arrayChar = new char[arrayInt.length];
        for (int j = 0; j < arrayInt.length; j++) {
            arrayChar[j] = (char) (arrayInt[j] + '0');
        }
        String ret = new String(arrayChar);
        //判断首位是否为0
        if (ret.charAt(0) == '0') {
            ret = ret.substring(1);
        }
        return ret;
    }

    private int[] toIntArr(char[] a) {
        int[] arr = new int[a.length];
        for (int i = 0; i < a.length; i++) {
            arr[i] = a[i] - '0';
        }
        return arr;
    }

    private int[] reverse(int[] a) {

        for (int i = 0; i < a.length / 2; i++) {
            int tmp = a[i];
            a[i] = a[a.length - 1 - i];
            a[a.length - 1 - i] = tmp;
        }
        return a;
    }

    public static void main(String[] args) {

//        String s = "0";
//        String t = "0";
        // [0, 1, 1]

        String s = "1039";
        String t = "28";
//        // [7, 6, 0, 1]
        Solution solution = new Solution();
        System.out.println(solution.solve(s, t));
    }
}

结果:
在这里插入图片描述

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无赖H4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值