老生常谈的大数加法

大数加法

问题概述:
两个极大的数进行加法求和
思路:
根据列竖式方式解决问题,一位一位的满十进一

package algorithm;

import java.util.Arrays;

/**
 * 大数加法
 */
public class BigNumAddition {
     
    public static void main(String[] args) {
     
        String num1 = "123";
        String num2 = "98";
        int[] numA = sub(num1);
        int[] numB = sub(num2);
        int[] add = add(numB, numA);
        print(add);
    }
    public static int[] sub(String num){
     
        int[] number = new int[num.length()];
        for (int i=0;i<num.length();i++){
     
            //低位在数组的前面,方便计算
            number[num.length()-1-i] = num.charAt(i)-48;
        }
        return number;
    }
    public static int[] add(int[] number1,int[] number2){
     
        int length = number1.length>number2.length?number1.length:number2.length;
        if (number1.length > number2.length){
     
            length = number1.length;
            //将短数组长度放大到与长数组一致,简化代码
            number2 = Arrays.copyOf(number2,length);
        }else{
     
            length = number2.length;
            number1 = Arrays.copyOf(number1,length);
        }
        int[] result = new int[length+1];
        for (int i=0;i<length;i++){
     
                result[i] = result[i]+number1[i]+number2[i];
                if(result[i]>=10){
     
                    result[i+1]++;
                    result[i] = result[i] - 10;
                }
        }
        return result;
    }
    public static void print(int[] number){
     
        for (int i=number.length-1;i>=0;i--){
     
            //寻找最高有效位,因为加法结果数组长度比原数最长长度大1,所以只用判断最高位是否是0即可
            //若次高位进位 则最高有效位必不为0 若无进位次高位必不为0 故可以只判断最高位
            if (number[i] == 0 && i == number.length-1){
     
                continue;
            }
            System.out.print(number[i]);
        }
    }
}

优化:
这时候是一位一位的进行进位计算,但int型可以存储的数字远大于一位数的大小,我们可以根据这一点对代码进行优化,每9位数为一组,可以减少运算次数,提高效率

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