数据结构---大整数相加

给出两个很大的整数,要求实现程序求出两个整数之和。

记得这个题目我大二ACM课程老师讲过,但是忘记了。。。。。。。。。。

列竖式运算

在这里插入图片描述
程序不可能通过一条指令计算出两个大整数之和,但我们却可以把大运算拆解成若干小运算,像小学生列竖式一样进行按位计算。
用数组存储大数:数组的每一个元素,对应着大整数的每一个数位。

第一步

创建两个整型数组,数组长度是较大整数的位数+1
把每一个整数倒序存储到数组中
整数的个位存于数组下标为0的位置,最高位存于数组的尾部。
之所以倒序存储,是因为这样更符合从左到右访问数组的习惯。

第二步

创建结果数组,结果数组的长度同样是较大整数的位数+1,
+1的目的是给最高位进位预留的。

第三步

遍历两个数组,从左到右按照对应下标把元素两两相加

第四步

把result数组的全部元素再次逆序,去掉首位的0(没有进位的情况),就是最终结果。

例子:
426 709 752 31 8 +95481 253 129
第一步
在这里插入图片描述
第二步
在这里插入图片描述

第三步
在这里插入图片描述
在这里插入图片描述
以此类推……一直把数组的所有元素都相加完毕。

在这里插入图片描述
第四步
在这里插入图片描述

JAVA实现

利用加‘0’和减‘0’完成char和int相互转换:JAVA中char转int小Tips

 /**
     * 大整数求和
     * @param bigNubmerA  大整数A
     * @param bigNumberB  大整数B
     * @return
     */
    public static String bigNumberSum(String bigNubmerA,String bigNumberB){
        //1.把两个大整数用数组逆序存储,数组长度等于较大整数位数+1
        int maxLength = bigNubmerA.length()>bigNumberB.length()?bigNubmerA.length():bigNumberB.length();
        int[]arrayA = new int[maxLength+1];
        int[]arrayB = new int[maxLength+1];
        for (int i=0;i<bigNubmerA.length();i++){
            //为了符合正常逻辑,数组的低位存储大数的低位
            arrayA[i] = bigNubmerA.charAt(bigNubmerA.length()-1-i)-'0';
        }
        for (int a:arrayA){
            System.out.print(a);
        }
        System.out.println();
        for (int i=0;i<bigNumberB.length();i++){
            //为了符合正常逻辑,数组的低位存储大数的低位
            arrayB[i] = bigNumberB.charAt(bigNumberB.length()-1-i)-'0';
        }
        for (int b:arrayB){
            System.out.print(b);
        }
        System.out.println();
        //2.构建result数组,数组长度等于较大整数位数+1
        int[] result = new int[maxLength+1];
        //3.遍历数组,按位相加
        for (int i = 0;i<result.length;i++){
            int temp = result[i];
            temp = temp+arrayA[i];
            temp = temp+arrayB[i];
            //判断是否进位
            if(temp>9){
                //进位操作
                temp = temp-10;
                result[i+1] = 1;
            }
            result[i] = temp;
        }
        //4.把result数组再次逆序并转成String
        StringBuffer sb = new StringBuffer();
        //是否找到大整数的最高有效位
        boolean findFirst = false;
        //从result高位开始遍历
        //应为result高位就是实际数字的低位
        for (int i= result.length-1;i>=0;i--){
            if(!findFirst){
                if(result[i]==0){
                    //说明高位是0,就再次循环,直到result[i]!=0时,才跳出
                    continue;
                }
                findFirst = true;
            }
            //到这一步,说明已经找到了非0最高位,就直接append就行
            sb.append(result[i]);
        }

        return sb.toString();
    }

测试方法:

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

在这里插入图片描述

这里为了方便存储数据查看,我以200+300为例子:
在这里插入图片描述

关键在于第四步代码需要注意
如何找到result的最高位,并开始遍历。。
借助findFirst标记和循环、continue

//4.把result数组再次逆序并转成String
        StringBuffer sb = new StringBuffer();
        //是否找到大整数的最高有效位
        boolean findFirst = false;
        //从result高位开始遍历
        //应为result高位就是实际数字的低位
        for (int i= result.length-1;i>=0;i--){
            if(!findFirst){
                if(result[i]==0){
                    //说明高位是0,就再次循环,直到result[i]!=0时,才跳出
                    continue;
                }
                findFirst = true;
            }
            //到这一步,说明已经找到了非0最高位,就直接append就行
            sb.append(result[i]);
        }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一、设计目的 本课程设计旨在通过实现一个大整数计算器,帮助学生深入理解数据结构的相关知识,掌握大整数的存储、运算等基本操作,提高编程能力。 二、设计内容 1.需求分析 大整数计算器需要支持以下功能: (1)大整数的输入输出 (2)大整数的加、减、乘、除运算 (3)大整数的比较大小 (4)大整数的求绝对值 (5)大整数的取模运算 2.数据结构设计 (1)大整数的存储 由于大整数可能会超出计算机所能表示的范围,因此需要使用链表来存储大整数。每个节点存储一个位数,节点之间通过指针连接。 (2)大整数的加、减、乘、除运算 加法:从低位到高位分别相加,若有进位则向高位一位加1。 减法:从低位到高位分别相减,若有借位则向高位一位减1。 乘法:将一个大数分解成若干个数字,每个数字与另一个大数相乘,然后将结果相加。 除法:将被除数和除数转换为整数,然后进行长除法运算。 (3)大整数的比较大小 从高位到低位比较每一位,若某一位不同则可以确定大小关系。 (4)大整数的求绝对值 将负数取反。 (5)大整数的取模运算 将被除数除以除数,求出余数。 3.算法设计 (1)大整数的加法 1.从低位到高位分别相加,若有进位则向高位一位加1; 2.若两数位数不等,则将短数的高位补0,使两数位数相同; 3.若最高位有进位,则需增加一位,将进位加在最高位。 (2)大整数的减法 1.从低位到高位分别相减,若有借位则向高位一位减1; 2.若被减数小于减数,则需向高位借位; 3.若减数的最高位为0,则需去除前导0。 (3)大整数的乘法 1.将一个大数分解成若干个数字,每个数字与另一个大数相乘,然后将结果相加; 2.从低位到高位依次计算,每次计算结果存储在一个临时变量中; 3.每次计算结束后,将结果加到最终结果中。 (4)大整数的除法 1.将被除数和除数转换为整数,然后进行长除法运算; 2.从高位到低位依次计算,将计算结果存储在一个临时变量中; 3.每次计算结束后,将结果加到最终结果中。 三、实现方法 1.使用C++语言实现。 2.使用链表存储大整数,每个节点存储一个位数,节点之间通过指针连接。 3.实现大整数的加、减、乘、除运算,比较大小和求绝对值等基本操作。 4.使用测试用例验证程序的正确性和鲁棒性。 四、总结 通过本课程设计,我深入理解了数据结构的相关知识,掌握了大整数的存储、运算等基本操作,提高了编程能力。同时,也感受到了编写高效、鲁棒的程序的重要性,这对我今后的学习和工作都有很大的帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值