题解 | #高精度整数加法#

高精度整数加法

http://www.nowcoder.com/practice/49e772ab08994a96980f9618892e55b6

题目的主要信息:

  • 输入两个字符串表示的整数,对其进行相加运算
  • 字符串中只有字符0-9,即正整数加法运算
  • 字符串长度:1<=n<=100001<=n<=10000

方法一:遍历相加

具体做法:

从两个字符串末尾开始往前遍历每个字符,直到遍历到两个字符串的下标都为0. 将遍历到的字符串转化为数字,如果其中一个字符串已经过了首部,则直接数字记为0.

然后将两个数字与进位变量相加,取余数放入现在这位,整除10作为进位,初始进位变量为0。最后结束之后如果进位变量还有1,则添加在后面。

最后将其逆序并转成字符串输出即可。

alt

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            String s1 = scan.next();
            String s2 = scan.next(); //输入两个数
            String res = add(s1, s2); //输出
            System.out.println(res);
        }
    }
 
    private static String add(String s1, String s2) { //两个字符串整数相加
        StringBuilder res = new StringBuilder();
        int n = s1.length() - 1;
        int m = s2.length() - 1;
        int carry = 0; //进位
        while (n >= 0 || m >= 0) { //从两个人字符串最后一位开始相加
            char c1 = n >= 0 ? s1.charAt(n--) : '0'; //没有了就用0代替
            char c2 = m >= 0 ? s2.charAt(m--) : '0';
            int sum = (c1 - '0') + (c2 - '0') + carry; //两个数子与进位相加
            res.append(sum % 10); //余数添加进结果
            carry = sum / 10;  //进位
        }
 
        if (carry == 1) { //最后的进位
            res.append(carry);
        }
        return res.reverse().toString(); //反转后转成字符串
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为较长字符串的长度,遍历最多是较长的字符串长度
  • 空间复杂度:O(n)O(n),保留运算结果的StringBuilder的长度最多为n+1n+1

方法二:大整数运算

具体做法:

直接利用Java的大整数类,将字符串转变成大整数类型,然后将后者加到前者。

import java.util.Scanner;
import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            String s1 = scan.next();
            String s2 = scan.next(); //输入两个数
            BigInteger a = new BigInteger(s1); //将字符串转成大整数
            BigInteger b = new BigInteger(s2);
            System.out.println(a.add(b)); //大整数相加
        }
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),大整数相加复杂度也是较长字符串的长度
  • 空间复杂度:O(n)O(n),大整数记录的空间最多是较长字符串的长度
孤帆远影碧空尽 文章被收录于专栏

牛客网各类题单题解~

全部评论
好家伙,这大整数运算等于直接作弊,哈哈哈哈哈哈
1 回复 分享
发布于 2021-12-10 14:26
题目要求保证字符串只含有'0'~'9'字符 可以在获取字符的时候加一个replaceAll把所有非0-9的字符都替换掉,保证纯数字 String s1 = scan.next().replaceAll("[^0-9]","");
1 回复 分享
发布于 2021-11-17 02:01
第一种方法太牛逼了
点赞 回复 分享
发布于 2024-07-28 11:41 广东
用第一种方法实现了一万年,结果可以大整数相加,气!
点赞 回复 分享
发布于 2024-04-12 17:25 广东
好强!学到了!感谢
点赞 回复 分享
发布于 2024-03-08 19:04 湖南
方法一?后面的补0写法错了,应该是'0'字节
点赞 回复 分享
发布于 2023-09-01 00:10 浙江
方法一的补零操作学到了
点赞 回复 分享
发布于 2023-03-21 18:02 广东
这就是API调用工程师
点赞 回复 分享
发布于 2022-07-28 12:35
方法二算不算作弊啊
点赞 回复 分享
发布于 2022-06-18 08:52

相关推荐

昨天 17:57
门头沟学院 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
评论
48
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务