算法:如何实现两个大数相加

2023-05-16

文章目录

  • 问题
  • 要求
  • 思路
  • 代码实现

问题

实现两个很大很大的数相加,求出它们的和。

要求

1、是整数;
2、两个数无限大,long 都装不下;
3、不能用 BigInteger;
4、不能用任何包装类提供的运算方法;
5、两个数都是以字符串的方式提供。

以下算法根据《漫画算法》小灰的算法之旅一书,并结合自己的心得,优化整理。

思路

  1. 用数组来处理很大的数
  2. 用“竖式”遍历相加,结果用数组来存储。
  3. 最后将数组倒序为 String 即可实现。

代码实现

package practise;
/**
 * <pre>
 *     author : June Yang
 *     time   : 2022/07/25
 *     desc   : 两个大数相加
 *     version: 1.0
 * </pre>
 */
public class BigNumAdd {
    public static void main(String[] args) {
        System.out.println(bigNumberNum("6868", "128080989089093"));
    }
    public static String bigNumberNum(String bigNumberA, String bigNumBerB) {
        int maxLength = Math.max(bigNumberA.length(), bigNumBerB.length());
        int[] arrayA = new int[maxLength + 1];
        // 将 String 转化成 int
        for (int i = 0; i < bigNumberA.length(); i++) {
            arrayA[i] = bigNumberA.charAt(bigNumberA.length() - 1 - i) - '0';
        }
        int[] arrayB = new int[maxLength + 1];
        // 将 String 转化成 int
        for (int i = 0; i < bigNumBerB.length(); i++) {
            arrayB[i] = bigNumBerB.charAt(bigNumBerB.length() - 1 - i) - '0';
        }
        // 得到结果的数组
        int[] result = new int[maxLength + 1];

        // 核心算法:竖式相加 满 10 进 1
        for (int i = 0; i < result.length; i++) {
            int temp = result[i];
            temp += arrayA[i];
            temp += arrayB[i];

            if (temp >= 10) {
                temp = temp - 10;
                result[i + 1] = 1; // 将进位后的 1 存到数组的下一位
            }
            result[i] = temp;
        }
        // 将 result 数组倒序之后再转成 String
        StringBuilder sb = new StringBuilder();
        boolean findFist = false;
        for (int i = result.length - 1; i >= 0; i--) {
            if (!findFist) {
                if (result[i] == 0) {
                   continue;  // continue 的作用:跳过当前循环继续下一个循环。此处 用于跳过结果数组末尾的 "0"
                }
                findFist = true;
            }
            sb.append(result[i]);
        }
        return sb.toString();
    }
}

小结:

时间复杂度为 o(n)。算法可以进一步优化。
网上有很多关于大数相加的解法,这个解法个人认为比较好理解,好上手。
在理解以上几个关键的点之后,很容易写出来。

扩展阅读:

  1. 进一步了解 java 中的工具类 BigInterger 和 BigDecimal。
  2. 其他相关算法:
    LeetCode 字符串相乘
    LeetCode 字符相加
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法:如何实现两个大数相加 的相关文章

  • Dell Inspiron 3443 BIOS升级问题解决

    问题解决方法可直接拖到文末 xff01 xff01 今天太难了 早上单位一位领导将笔记本拿来 xff0c 说是用起来很卡 xff0c 想让帮忙重装一下系统 欣然答应 查看型号 xff0c DELL Inspiron 14 3443 xff0
  • 任务栏可以点,电脑桌面却不显示内容的解决方法

    今天同事遇到了一个奇怪的问题 xff1a 台式电脑电源被踢掉了 xff0c 重新插电重启电脑后 xff0c 发现桌面上的东西都不见了 xff0c 只剩下边的任务栏空荡荡 而且只有点击win键 xff0c 能向上弹出菜单界面 xff0c 其他
  • 一条简单命令校验MD5

    最近在重新制作工具U盘 xff0c 要下载很多文件 xff0c 有些较大文件需要校验MD5码 网上搜索MD5码校验工具 xff0c 感觉弹出来的下载站多数不靠谱得很 因为是在Windows平台 xff0c 觉得还是用自带的工具CertUti
  • Broadcom 802.11n网络适配器,网络连接没有有效的ip配置问题解决

    昨天帮同事解决了一个无线网络的问题 xff1a 可以连接公司的无线热点 xff0c 但无法上网 xff1b 但是连接自己家里的网络后可以正常上网 问题的奇怪之处在于 xff0c 检查了网络设置 xff0c 并没有发现什么配置错误 IP也是自
  • 关于电脑出厂时间查询工具的构思

    在做一个单位的计算机盘点 管理的时候 xff0c 很容易遇见需要知道电脑的采购时间 xff0c 或者出厂时间 这个信息能够帮助管理人员决定电脑是否该按定期报废制度进行报废或更换 目前为止 xff0c 作者接触过的各类电脑 xff0c 没有看
  • Outlook频繁崩溃解决方法

    这几天新换了笔记本 xff0c IT部门帮忙进行了配置 xff0c 拿到手上却屡屡发现邮件系统这出问题那出问题 xff0c 好生烦躁 经过几天的修修补补 xff0c 今天总算完全OK了 xff0c 又恢复到正常的轨道上来了 由于被折磨得够呛
  • Manifest文件详解

    一 关于AndroidManifest xml AndroidManifest xml 是每个android程序中必须的文件 它位于整个项目的根目录 xff0c 描述了package中暴露的组件 xff08 activities servi
  • Android蓝牙完全学习手册

    1 前言 市面上关于Android的技术书籍很多 xff0c 几乎每本书也都会涉及到蓝牙开发 xff0c 但均是上层应用级别的 xff0c 而且篇幅也普遍短小 对于手机行业的开发者 xff0c 要进行蓝牙模块的维护 xff0c 就必须从An
  • 【高级】深入理解Word里的字号、行距、段距、间距、样式

    昨天领导交给我一份文档 xff0c 让我帮忙修改一下 改完后最后一页只有单独的一行 xff0c 打印出来不够美观 因此 xff0c 我缩小了行距 xff0c 把默认的单倍行距改为了固定值28磅 结果是 xff0c 整个文档的确少了一页 xf
  • 笔记本插上耳机后仍在外放Realtek Audio Console不支持此机器

    大年初七 xff0c 开工第一天 下午办公室新来的同事请教的如题问题 他用的华硕笔记本 xff0c 飞行堡垒FX86FE 插上华为耳机 xff0c 耳机始终播放不出来声音 显示已经检测到耳机插入了耳机孔 xff0c 点击弹窗会显示 Real
  • git Filename too long

    全局 git config global core longpaths true 当前仓库 git config core longpaths true 转载于 https www cnblogs com EasonJim p 108038
  • VxWorks入门级开发环境学习

    由于实习需要 xff0c 最近在学习VxWorks xff0c 久闻该操作系统大名 xff0c 一直被其深厚的内力震撼着从未敢去了解 xff0c 直到最近 操作系统Vxworks本身的优点特点等详细信息不多说了 xff0c 这里讲讲几天来我
  • 树莓派 Retropie 4.4中文版使用说明 含roms资源

    漫步云端服务器 http chdong top bbs http www chdong top 相关名词 Retropie Retropie可以将你的树莓派或者PC变成一台复古游戏机 Retropie基于完整的操作系统之上 xff0c 你可
  • selenium 中 css-寻找元素

    等同于 tag名 不改变 elements 61 wd find elements by css selector 39 div 39 elements 61 wd find elements by tag name 39 div 39 i
  • 解决 The following packages have unmet dependencies: 问题

    The following packages have unmet dependencies libvtk5 dev Depends libfreetype6 dev but it is not going to be installed
  • 2.1Ubuntu20.4安装QT5.14.2

    QT简介 xff1a Qt是一个跨平台的C 43 43 图形用户界面库 xff0c 我们平时所说所使用的Qt xff0c 准确的来说是它的GUI编程部分 Qt提供给应用程序开发者建立图形用户界面所需要的功能 xff0c 并且Qt很容易扩展
  • 美国出台最严技术出口管制!14项前沿科技面临封锁

    关注ITValue xff0c 查看企业级市场最新鲜 最具价值的报道 xff01 xff08 本文转载自量子位公众号 xff0c ID xff1a QbitAI xff0c 作者 xff1a 乾明 夏乙 问耕 xff09 美国又打出一套七伤
  • sftp文件上传详解

    JSch是Java Secure Channel的缩写 JSch是一个SSH2的纯Java实现 它允许你连接到一个SSH服务器 xff0c 并且可以使用端口转发 xff0c X11转发 xff0c 文件传输等 xff0c 当然你也可以集成它
  • 数据库设计 ER图

    一 E R图构成要素 E R图也称实体 联系图 Entity Relationship Diagram xff0c 提供了表示实体类型 属性和联系的方法 xff0c 用来描述现实世界的概念模型 它是描述现实世界关系概念模型的有效方法 是表示
  • ssh-keygen -t rsa详解

    ssh keygen q 安静模式 b bits 位数 t dsa ecdsa ed25519 rsa rsa1 加密算法 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 6

随机推荐