Java——大数加法

一、题目描述
以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

数据范围:s.length,t.length≤100000,字符串仅由’0’~‘9’构成
要求:时间复杂度 O(n)O(n)

注:long的最大值:9223372036854775807
即long的最大值才19位,而t的最大长度是10万位

二、我的答案

import java.util.*;
import java.math.BigInteger;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        BigInteger value1 = new BigInteger(s);
        BigInteger value2 = new BigInteger(t);
        return value1.add(value2).toString();
    }
}

在这里插入图片描述
用BigInteger是投机取巧的做法,这题考察的是大数计算器的思想,只需要想象一下我们在做加法时,都做了什么事情,其实只有两种情况:需要进位和不需要进位。所谓进位,无非是当前位相加大于等于10的话,就在下一位加1。那么我们就可以用一个变量carry来表示是否有进位,有进位为1,无进位为0。

三、更好答案
在这里插入图片描述

    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     *
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve(String s, String t) {
        // write code here
        char[] a = s.toCharArray();
        char[] b = t.toCharArray();
        char[] result = new char[Math.max(a.length, b.length) + 1];

        int rIndex = result.length - 1;
        int aIndex = a.length - 1;
        int bIndex = b.length - 1;

        int carry = 0;

        while (aIndex >= 0 && bIndex >= 0) {
            int A = a[aIndex--] - '0';
            int B = b[bIndex--] - '0';
            result[rIndex--] = (char) ((A + B + carry) % 10 + '0');
            carry = (A + B + carry) / 10;
        }

        while (aIndex >= 0) {
            int A = a[aIndex--] - '0';
            result[rIndex--] = (char) ((A + carry) % 10 + '0');
            carry = (A + carry) / 10;
        }

        while (bIndex >= 0) {
            int B = b[bIndex--] - '0';
            result[rIndex--] = (char) ((B + carry) % 10 + '0');
            carry = (B + carry) / 10;
        }

        if (carry != 0) {
            result[rIndex] = (char) (carry + '0');
            return String.valueOf(result);
        }
        return String.valueOf(result).substring(1);
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值