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

大整数相加

  • 列竖式运算
    • 第一步
    • 第二步
    • 第三步
    • 第四步
  • JAVA实现

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

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

列竖式运算

数据结构---大整数相加_第1张图片
程序不可能通过一条指令计算出两个大整数之和,但我们却可以把大运算拆解成若干小运算,像小学生列竖式一样进行按位计算。
用数组存储大数:数组的每一个元素,对应着大整数的每一个数位。

第一步

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

第二步

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

第三步

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

第四步

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

例子:
426 709 752 31 8 +95481 253 129
第一步
数据结构---大整数相加_第2张图片
第二步
数据结构---大整数相加_第3张图片

第三步
数据结构---大整数相加_第4张图片
数据结构---大整数相加_第5张图片
以此类推……一直把数组的所有元素都相加完毕。

数据结构---大整数相加_第6张图片
第四步
数据结构---大整数相加_第7张图片

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"));
    }

数据结构---大整数相加_第8张图片

这里为了方便存储数据查看,我以200+300为例子:
数据结构---大整数相加_第9张图片

关键在于第四步代码需要注意
如何找到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]);
        }

你可能感兴趣的:(数据结构和算法,数据结构,java,算法)