求两个大数之和

编程实现大数的加法。编程

好比说,给出两个数a,b,它们各自的位数都大于1000(用String来表示)。这时候,咱们发现,用任何一种数据类型都不足以表示这两个数,更别说表示这两个数之和了。所以,咱们能够用换一种方式,经过两个数组来分别表示这两个数,而后把两个数组对应位置的元素各自相加,则可求得两个数之和。数组

这样处理的难点在于对齐。咱们知道,加法是从低位开始相加的,转换成数组的话,若是是正常处理,则可能须要在较小数的前面补0,处理起来略微麻烦,所以咱们能够经过翻转这个数,把高位放在数组的后面,这样就不须要另外去补0了。app

另一个难点是进位。个人想法是,在求出各个位置相加的和以后,再做处理。若是当前位置上的元素>9,则须要向后进位(由于此时数已经被翻转了)。ui

实现代码以下:spa

public class Main {
    public static void main(String[] args) {
        
        String a = null;
        String b = null;
        Scanner sc = new Scanner(System.in);
        a = sc.nextLine();
        b = sc.nextLine();
        System.out.println(getRes(a, b));
    }
    
    public static String getRes(String a, String b) {
        char[] large = null;
        char[] small = null;
        if(a.length() > b.length()) {
            large = a.toCharArray();
            small = b.toCharArray();
        }else {
            large = b.toCharArray();
            small = a.toCharArray();
        }
        int len = a.length();
        int[] sum = new int[len];
        //把这个数倒过来,处理起来比较方便
        for(int i = 0; i < len; i++) {
            sum[i] = large[len-1-i] - '0';
        }
        for(int j = 0; j < small.length; j++) {
            sum[j] += (small[small.length-1-j] - '0');
        }
        //进位,当sum数组上的元素大于9时,则说明这个位置须要向前进位,可是因为咱们前面把数倒过来,因此在这里是向后进位
        for(int k = 0; k < len - 1; k++) {
            if(sum[k] > 9) {
                sum[k+1] += sum[k]/10;
                sum[k] = sum[k] % 10;
            }
        }
        StringBuilder sb = new StringBuilder();
        //把数组元素翻转,则可求得须要的结果
        for(int k = len-1; k  >= 0; k--) {
            sb.append(sum[k]);
        }
        String res = sb.toString();
        //细节处理,若是该字符串的首位为0,则证实没有进位,应该把0给去掉
        if(res.charAt(0) == '0') {
            res = res.substring(1);
        }
        return res;
    }