求兩個大數之和

編程實現大數的加法。編程

好比說,給出兩個數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;
    }
相關文章
相關標籤/搜索