1. 程式人生 > 實用技巧 >ECNU 1001 Problem A+B (Big Integer)

ECNU 1001 Problem A+B (Big Integer)

ECNU 1001 Problem A+B (Big Integer)

連結

https://acm.ecnu.edu.cn/problem/1001

題目

單點時限: 2.0 sec

記憶體限制: 256 MB

Give two positive integer a and b, calucate a+b.

Notice that ab is no more than 500 digits.

輸入格式
The test case contain several lines. Each line contains two positive integer and .

輸出格式
For each input line, output a line contain .

樣例
input
2 3
1231231231823192 123123123123123
1000000000000000 1
output
5
1354354354946315
1000000000000001

思路

英文題目,大數加法,不過只有加法嗎。
上面說了不少於500位,那麼傳統方法就不行了,只有用字串來進行計算,這裡就寫一下思路。
先給兩個字串,轉置。之後找到較短的那個,後面補0到二者等長,這裡新建一個數組,存放每一位的加法,大於9也照樣存放進來(其實可以省去補0),之後對於每一位,如果大於9,就只取個位放在原處,前面補一位,這是模擬進位。最後把全部轉為字串。思路是相對通用的,要是專門為了這道題可以再優化不少。

程式碼

   public static void fun() {

    Scanner sc = new Scanner(System.in);
    while (sc.hasNext()) {
      String s1 = sc.next();
      String s2 = sc.next();
      StringBuilder a = new StringBuilder(s1);
      StringBuilder b = new StringBuilder(s2);
      a.reverse();
      b.reverse();

      int m = a.length();
      int n = b.length();
      int max = Math.max(m, n);
      if (m < n) {
        for (int i = m; i < n; i++) {
          a.append('0');
        }
      } else {
        for (int i = n; i < m; i++) {
          b.append('0');
        }
      }
      int[] ans = new int[max + 1];
      for (int i = 0; i < max; i++) {
        ans[i] = (a.charAt(i) - '0') + (b.charAt(i) - '0');
      }
      for (int i = 0; i < max; i++) {
        ans[i + 1] += ans[i] / 10;
        ans[i] %= 10;
      }
      StringBuilder result = new StringBuilder();
      for (int i = 0; i < max; i++) {
        result.append(ans[i]);
      }
      if (ans[max] != 0) {
        result.append(ans[max]);
      }
      System.out.println(result.reverse().toString());
    }

  }