首页 > 其他分享 >求两个大整数之和

求两个大整数之和

时间:2025-01-07 23:22:54浏览次数:7  
标签:两个 String temp int 整数 length result

9.如何实现大正整数相加

题目

给出两个很大的整数,要求实现程序求出两个整数之和。超出Java中的Long类型的范围的整数,如何求和。

思路

使用到小学的数学了,对于大的数,小学老师会教,列竖式进行计算。

对于,计算机,无法计算太大的数,进行加运算。我们可以将大的数,转成一个个小的整数,创建两个int[],长度是较大整数的位数+1。大整数一般是使用字符串进行存储的,倒序转化到两个整数数组中,倒叙是为了,满足习惯的顺序遍历数组。然后按位相加,记录结果到,多一位的数组中,多出来的哪一位就是为了给可能出现的进位,预留的位置。然后,再顺序凭借为字符串,作为结果。

代码

    public static String bigNumberSum(String bigNumA, String bigNumB) {
        int maxLen = Math.max(bigNumA.length(), bigNumB.length());
        int[] arrayA = bigNumberToIntArray(bigNumA, maxLen + 1);
        int[] arrayB = bigNumberToIntArray(bigNumB, maxLen + 1);
        int[] result = new int[maxLen + 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;//计算进位后的值,保存到当前位
                //将高于当前位的直接设为1,为什么不是+1,因为此时的result[i+1]的值一定是0,赋值1和+1结果一样,
                //但是对于计算机的底层指令,赋值操作指令会少一些,因为+1操作,要先从寄存器中读取值,再+1,再会写到寄存器,而赋值操作,不需要读取,直接赋值
                result[i + 1] = 1;
            }
            result[i] = temp;//保存到当前位
        }
        StringBuffer sb = new StringBuffer();
        boolean findFirst = false;
        for (int i = result.length - 1; i >= 0; i--) {
            if(!findFirst){
                if(result[i] == 0){//如果最后一位为0,则不将这个0添加到最后结果中
                    continue;
                }
                findFirst = true;//除最后一位都不再进入该if语句
            }
            sb.append(result[i]);//其余位都添加
        }
        return sb.toString();
    }

    /**
     * @param bigNumber   被转换的大数
     * @param arrayLength 转换后的intArray的长度
     * @return 例 "123456789" 10 -> {9,8,7,6,5,4,3,2,1,0}
     */
    public static int[] bigNumberToIntArray(String bigNumber, int arrayLength) {
        int[] arr = new int[arrayLength];
        int len = bigNumber.length();
        for (int i = 0; i < len; i++) {
            //倒序获取字符的数字值,顺序存到arr中
            arr[i] = bigNumber.charAt(len - i - 1) - '0';
        }
        return arr;//未赋值的,默认值为0
    }

    public static void main(String[] args) {
        System.out.println(bigNumberSum("123456789","123456789"));
    }

时间复杂度为O(n)。

上述代码可以,进行优化,因为差分的数组,可以大一些,因为java中,int类型的取值范围是(-2147483648-2147483647),最多可以有10位,给溢出位留一位,取大整数,每9位做一个int[]数组的元素,进行加法运算(也可以使用long类型数组,只是扩展一个思路)。
只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

标签:两个,String,temp,int,整数,length,result
From: https://www.cnblogs.com/changming06/p/18658640

相关文章

  • 安卓笔记4——Result API 在两个Activity之间传递数据 kotlin版本
    第一个Activity//接收第二个Activity返回的回调privatevalrequestDataLauncher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){result->if(result.resultCode==RESULT_OK){valdata=result.data?.getS......
  • 力扣13罗马数字转整数
    classSolution:defromanToInt(self,s:str)->int:#定义罗马数字到整数的映射change={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}#......
  • win10_install.wim 和 sysprep 是 Windows 系统部署和镜像管理中的两个重要概念,它们在
    win10_install.wim和sysprep是Windows系统部署和镜像管理中的两个重要概念,它们在用途、内容、以及操作方式上有显著的区别。下面将对这两者进行详细的比较:1. win10_install.wimwin10_install.wim是Windows安装映像文件(WindowsImagingFormat)。它是Windows安装过程中......
  • AutoGen入门-让两个AI自行聊天完成任务
    AutoGen介绍AutoGen是一个开源编程框架,用于构建AI代理并促进多个代理之间的合作以解决问题。AutoGen旨在提供一个易于使用和灵活的框架,以加速代理型AI的开发和研究,就像PyTorch之于深度学习。它提供了诸如代理之间可以对话、LLM和工具使用支持、自主和人机协作工作流以及......
  • vxe-table 实现 excel 选择两个单元格,拖拽自动识别数字规则并根据规则自动填充新的单
    vxe-table实现excel选择两个单元格,拖拽自动识别数字规则并根据规则自动填充新的单元格官网:https://vxetable.cn鼠标按住右下角扩展按钮,当选取一个单元格时,自动将当前内容填充到扩展区域的所有单元格中,如果不希望自动识别数字规则,可以同时按住ctrl键可取消值自动识别数字功......
  • 使用LEB128格式对整数进行编码
    大小端比如说4个字节长度的一个十六进制的无符号整数:0x12345678,使用大端和小端两种表示方法的内存布局如下: LEB128编码说明LEB128(Little-EndianBase128)使用小端表示法,因为计算机处理小端表示法比较方便。其每个字节只有7位为有效位,如果第一个字节的最高位为1,表示LEB12......
  • 合并两个排序的链表(C++)
    问题描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。数据范围:0≤n≤10000≤n≤1000,−1000≤节点值≤1000−1000≤节点值≤1000要求:空间复杂度O(1)O(1),时间复杂度O(n)O(n)如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,......
  • 96. 不同的二叉搜索树 && 343. 整数拆分 Golang实现
    这两个题目的分析思路是十分类似的。都是进行一个拆分。1.不同的二叉搜索树题目描述:给你一个整数n,求恰由n个节点组成且节点值从1到n互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。示例1:输入:n=3输出:5思路分析:动态规划分析:确定状态:令dp[i]......
  • 【前端面试题】前端中的两个外边距bug以及什么是BFC
    外边距合并问题兄弟组件中,如果一个设置margin-bottom,另一个设置margin-top,会导致外边距出现合并的问题,例如box1设置下边距50px,box2设置上边距20px,那么二者之间的外边距进行合并取最大值,所以二者之间相距只有50px。解决办法:给两个兄弟组件加一个父组件,让父组件开启flex布局.......
  • 【剑指Offer刷题系列】整数拆分 II
    目录问题描述示例示例1:示例2:示例3:思路解析核心思路:具体步骤:复杂度分析:代码实现Python实现测试代码复杂度分析时间复杂度空间复杂度结论问题描述现需要将一根长度为正整数bamboo_len的竹子砍为若干段,每段长度均为正整数。请返回每段竹子长度的最大乘积......