前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >大数加法

大数加法

作者头像
忧愁的chafry
发布于 2022-10-30 07:39:22
发布于 2022-10-30 07:39:22
9030
举报
文章被收录于专栏:个人技术笔记个人技术笔记

题目:

思路:

先是说一说对这道题的理解吧,对于数字运算,我们大都知道int是存在范围的,long也是有范围的,但是当面对数值超出范围的时候我们要怎么应对,大概就是这题的一个知识点吧。

其次这题也很明显存在暴力破解的办法,就是将两个字符串的一位取出,进行转义相加,然后存在进位情况。依次处理最后达到了得出相加之后的字符串。方法二明显会更符合简单思维一点,就是弄出三个数组,然后两个塞参数,一个塞相加之后的结果,最后将结果数组输出。

方法一明显是方法二的一种升华,减少了使用空间,通过条件循环,遍历空两个字符串,对于先遍历空的补零。然后操作完的塞进StringBuilder 里面。最后的出相加后的数值。

其次还有一种方法,就是截取字符串范围值,利用 int b=Integer.parseInt(s); 这种方式,如 int的取值范围为-2147483648到+-2147483648 ,那么如果我们取九个字符串转义成int类型然后两个int相加的话必然会在int的取值范围内,那么18个字符长度的字符串相加,我们是不是只要操作两次就可以了呢,是不是更加便捷。

代码示例:

import java.util.Arrays;

public class Solution {

    public static void main(String[] args) {

        String s = "0", t = "0";

        String result = solve2(s, t);

        System.out.println(result);

    }

    /**

     * 这一种方法相对第二种是一种升华,减少了开创的空间,

     * 都是从数字末端遍历,直至两个字符串都被遍历完,先遍历完的每次都会补上一个0

     * 其次还会检查最后是否存在了字符串都遍历完了但是存在进位问题的处理

     * 最后得出的字符串就像是第二种得出的结果数组一样的需要经过一次反转成为目标字符串

     *

     * @param s string字符串 表示第一个整数

     * @param t string字符串 表示第二个整数

     * @return string字符串

     */

    public static String solve(String s, String t) {

        StringBuilder ans = new StringBuilder();

        int tmp = 0;

        int ls = s.length() - 1, lt = t.length() - 1;

        while (ls >= 0 || lt >= 0 || tmp == 1) {

            int l = ls >= 0 ? (s.charAt(ls--) - '0') : 0;

            int r = lt >= 0 ? (t.charAt(lt--) - '0') : 0;

            int plus = l + r + tmp;

            tmp = plus / 10;

            char a = (char) (plus % 10 + '0');

            ans.append(a);

        }

        return ans.reverse().toString();

    }

    /**

     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可

     * 计算两个数之和

     *

     * @param s string字符串 表示第一个整数

     * @param t string字符串 表示第二个整数

     * @return string字符串

     */

    public static String solve2(String s, String t) {

        int num1 = s.length(), num2 = t.length();

        int maxNum = Math.max(num1, num2);

        int[] arr1 = new int[maxNum + 1];

        int[] arr2 = new int[maxNum + 1];

        int[] result_arr = new int[maxNum + 1];

        for (int i = 0; i < num1; i++) {

            arr1[i] = s.charAt(num1 - 1 - i) - '0';//针对字符转义成int类型

        }

        System.out.println(Arrays.toString(arr1));

        for (int i = 0; i < num2; i++) {

            arr2[i] = t.charAt(num2 - 1 - i) - '0';//针对字符转义成int类型

        }

        System.out.println(Arrays.toString(arr2));

        //进行数字的加减合并,从个位数往上相加,超过10就进一位。

        for (int i = 0; i < maxNum; i++) {

            int temp = result_arr[i] + arr1[i] + arr2[i];

            if (temp >= 10) { //十进一

                temp = temp - 10;

                result_arr[i + 1] = result_arr[i + 1] + 1;

            }

            result_arr[i] = temp;

        }

        System.out.println(Arrays.toString(result_arr));

        StringBuffer str = new StringBuffer();

        boolean is_top = false;

        //用于遍历结果数组,从末尾遍历到开头,要处理最末尾那些是0开头的数字,不能输出0098765,而是输出正确的98765

        for (int i = maxNum; i >= 0; i--) {

            //这是很重要的一种情况,就是极限值没有考虑到,卡了我好久,就是当两个字符串都是0的时候,应该输出0

            //但是上面会忽略也就是如果一直未false时就不会添加元素 所以我加了 && i != 0 这个条件

            if (!is_top && i != 0) { //当碰到第一个不为0的开头时就不断的往里面添加元素

                if (result_arr[i] == 0) {

                    continue;

                } else {

                    is_top = true;

                }

            }

            str.append(result_arr[i]);

        }

        if (!is_top) {

            //这是很重要的一种情况,就是极限值没有考虑到,卡了我好久,就是当两个字符串都是0的时候,应该输出0

            //但是上面会忽略也就是如果一直未false时就不会添加元素

        }

        return str.toString();

    }

}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
两个大数相加的三种实现方法
方法一: import java.math.BigDecimal; /** * 两个大数相加 * * @author * @version $Id: BigNumberAdd.java, v 0.1 2014年8月18日 下午2:13:20 */ public class BigNumberAdd1 { public static void main(String[] args) { String num1 = "34646313135
程序新视界
2022/11/30
7040
59 大数加法
输入两行,表示两个数字a和b,-109 <= a , b <= 109 ,用双引号括起。
devi
2021/08/19
6990
原来字节跳动也不会大数加法,抖音点赞直接点爆了。
最近有一位明星挺火的,因为在他的直播间送车,导致很多人到他直播间观看,在线人数已经超过了10万,具体有多少人看过就不知道了,但点赞人数直接超出了 int 的最大值,溢出了,变成了负数 -1669450377 。
数据结构和算法
2025/01/16
600
原来字节跳动也不会大数加法,抖音点赞直接点爆了。
【JAVA SE】String类 超简洁粗暴语法整理
java的字符串存储是直接用String这个引用数据类型的,而非像C语言那样只能用字符数组或者字符指针,更是满足面向对象这一思想。
用户11292525
2024/09/26
1190
【JAVA SE】String类 超简洁粗暴语法整理
leetcode-43. 字符串相乘
  这道题的思路是让一个字符串每个字符与另一个字符串的每一个字符相乘,该进位就进位,该补 0 就补 0,每一次相乘后将结果相加,加到最终就是相乘的结果。   若两个字符串任一为 0,则相乘结果就是 0,直接返回 0 即可。定义一个储存结果集的变量,按照题目要求是字符串,分别求出两个字符串的长度,对 num2 从右边开始遍历,因为右边是低位,定义一个可拼接的 StringBuffer 类型的变量,定义一个储存进位值的变量,i 向左移动是向高位移动,移动几位就要补几个零,读取每一个字符与 ‘0’ 作差得到整形的结果,这是因为 ASCII 码值的字符 ‘0’~‘9’ 是紧挨着的。 同样的,对 num1 从低位进行遍历,先获取字符对应的整形值,两整形相乘加上上一个进位,将结果对 10 求余,得出个位的值,十位的当进位处理,并将结果除以 10 取整,相当于只获取了十位的值,最后的进位是当新的一位处理,直接拼接即可,以上各种拼接后,数值大的在右边,而现实的数,数值大的在右边,所以需要进行一次反转,调用字符串相加的算法得出结果后加入结果集,最后返回最终结果集即可。   字符串相加的算法:思路是将其每个字符转换成整型相加得出结果再转换成字符串。首先获取传进来的两个字符串的长度,且定义一个保存进位的 add 变量,定义结果集,只要以上三个变量不为任一一个不为 0 都能进入循环,只要 num1 或者 num2 的长度不为 0 则进行取值。这里的 num1.charAt(i) - '0' 主要是利用字符 ‘0’ 到 ‘9’ 的 ASCII 码值是连续的,让其作差即可得到字符的本身的整型值。   取完值,两字符串相加再加上上一步的进位,对结果求余作为本次运算的结果,再对结果除以 10 获得进位的值,同步维护两个指针,最后要记得将答案反转一下,因为拼接字符串是从左到右拼接的,但是我们的数是从又到左数值越大的,返回最终答案,记得 toString 变成 String 类型。
灰太狼学Java
2022/06/17
3690
leetcode-43. 字符串相乘
《JavaSE》---17.<String 类的常见操作>
我们都知道String是字符串类型,是引用类型。在java中String也是一个类。
用户11288958
2024/09/24
1770
《JavaSE》---17.<String 类的常见操作>
JAVA入门学习五
Scanner的概述:一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串,以默认空格作为分割。 Scanner的构造方法原理:
全栈工程师修炼指南
2020/10/23
5660
JAVA入门学习五
两个链表生成相加链表
本题难点:第一,不知道链条有多大,最合起来的数可能会远大于long与int能存的极限。
忧愁的chafry
2022/10/30
5620
两个链表生成相加链表
20个常用的JavaScript简写技巧
任何编程语言的简写技巧都能够帮助你编写更简练的代码,让你用更少的代码实现你的目标。让我们一个个来看看 JavaScript 的简写技巧吧。
深度学习与Python
2020/12/07
1K0
【Day23】力扣:LeetCode算法刷题 [927. 三等分 ] [415. 字符串相加]
如果无法做到,就返回 [-1, -1]。 注意,在考虑每个部分所表示的二进制时,应当将其看作一个整体。例如,[1,1,0] 表示十进制中的 6,而不会是 3。此外,前导零也是被允许的,所以 [0,1,1] 和 [1,1] 表示相同的值。 / 示例 1: 输入:arr = [1,0,1,0,1] 输出:[0,3] / 示例 2: 输入:arr = [1,1,0,1,1] 输出:[-1,-1] / 示例 3: 输入:arr = [1,1,0,0,1] 输出:[0,2] / 提示: 3 <= arr.length <= 3 * 104 arr[i] 是 0 或 1
.29.
2022/11/15
2520
【Day23】力扣:LeetCode算法刷题 [927. 三等分 ] [415. 字符串相加]
lc新手半个月的42道题 (带注解
由于计算机无法存储浮点数的精确值(浮点数的存储方法可以参考 IEEE 754,这里不再赘述),因此在得到结果的整数部分 ans\textit{ans}ans 后,我们应当找出 ans\textit{ans}ans 与 ans+1\textit{ans} + 1ans+1 中哪一个是真正的答案。
汪汪想变强
2023/10/05
3120
抽丝剥茧C语言(初阶 中)
大家要清楚一件事,C语言有C语言的语法,就像汉语和英语都有自己的规则一样,美国人学中文也觉得别扭,国人学英语也别扭,经常中式英语,所以你学什么语言就要遵守什么语言的语法规则,有些地方不要过度深究,不然你的思绪就会越来越乱!
有礼貌的灰绅士
2023/03/28
6920
抽丝剥茧C语言(初阶 中)
leetcode-415. 字符串相加
  这道字符串相加的思路是将其每个字符转换成整型相加得出结果再转换成字符串。首先获取传进来的两个字符串的长度,且定义一个保存进位的 add 变量,定义结果集,只要以上三个变量不为任一一个不为 0 都能进入循环,只要 num1 或者 num2 的长度不为 0 则进行取值。这里的 num1.charAt(i) - '0' 主要是利用字符 ‘0’ 到 ‘9’ 的 ASCII 码值是连续的,让其作差即可得到字符的本身的整型值。   取完值,两字符串相加再加上上一步的进位,对结果求余作为本次运算的结果,再对结果除以 10 获得进位的值,同步维护两个指针,最后要记得将答案反转一下,因为拼接字符串是从左到右拼接的,但是我们的数是从又到左数值越大的,返回最终答案,记得 toString 变成 String 类型。
灰太狼学Java
2022/06/17
5260
leetcode-415. 字符串相加
【算法千题案例】每日LeetCode打卡——75.字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
呆呆敲代码的小Y
2021/11/15
2580
js表单验证工具包
常用的js表单验证方法大全 1 /* 2 非空校验 : isNull() 3 是否是数字: isNumber(field) 4 trim函数: trim() lTrim() rTrim() 5 校验字符串是否为空: checkIsNotEmpty(str) 6 校验字符串是否为整型:
HUC思梦
2020/09/03
12.1K0
【leetcode速通java版】04——哈希表
1.哈希表主要用来解决快速获取某个元素的问题。比如查找一个学校的姓名为张三的学生,如果用数组需要的时间复杂度为O(n),但是使用哈希表的时间复杂度为O(1).
半旧518
2023/10/17
1740
【leetcode速通java版】04——哈希表
Java 常用类
String a="hello"+"abc";//==>优化等价 String a="helloabc";
用户9615083
2022/12/25
6030
Java 常用类
leetcode之字符串相加
这里对两个字符串从后开始遍历,然后进行累加,取余数添加到结果集,然后取模,继续循环,最后将结果反转一下。
code4it
2020/10/30
5540
leetcode之字符串相加
定义一个函数,在该函数中可以实现任意两个整数的加法。java实现
这道题实际上是一道面试题的拓展,原题是要求打印1到最大的n位数。原题是这样描述的:输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1,2,3,4,5一直到最大的三位数999。拿到这道题之后,对于没有大数经验的面试者估计立马就想到了一种简单的解法。首先求出这个最大的n位数,然后来一个for循环从1开始逐个打印。假如这么想那就掉入面试官的陷阱中去了。实际上这道题远没有这么简单,必须从大数的角度来解答。对于计算机而言,它的任意一个数据类型都是有范围的。如果我们输入的数据大于计算机所能表示的范围,那么计算机必然会报错。所以这个时候需要使用另外一种方法来表示这些大数。至于这道题是怎么解决的,自行百度,网上有很多资源。
我是李超人
2020/08/21
1.9K0
Java刷题常见的集合类,各种函数的使用以及常见的类型转化等等
相信大家在刷算法题的过程中,好不容易想出来大概的思路,也知道去用哪个集合类,但各个集合类的一些命令都长得太像,很容易将他们弄错,并且在各集合之间的转化也是特别烦人,还有很多实用的函数都知道可以去用,但总是会忘记。
用户11369558
2024/12/24
1050
Java刷题常见的集合类,各种函数的使用以及常见的类型转化等等
相关推荐
两个大数相加的三种实现方法
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文