ECNU 1001 Problem A+B (Big Integer)
阿新 • • 發佈:2021-01-21
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()); } }