Baekjoon10757: 큰 수 A + B

Baekjoon10757: 큰 수 A + B

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 A와 B가 주어진다. (0 < A,B < 10^10000)

출력

첫째 줄에 A+B를 출력한다.

추상화

10의 10000승은 엄청 크다. 길이를 보았을 때 숫자형을 이용할 수는 없다고 보았다

문자열을 통한 연산을 구현한다

1) 처음에는 단순히 길이가 큰 쪽에 작은 쪽을 더하고 각 자리의 합이 10을 넘으면 윗 자리 값에 1을 추가하는 것을 생각했다

예시) 12848214912492

+ 123124043

→length가 작은 곳을 기준으로 계산한다

2) 그러나 앞자리가 연쇄적으로 바뀔 때 문제가 생긴다

예시) 9999999999999

+ 1

3) 2번을 극복하기 위해 각 자리의 수를 맞춘다

예시) 9999999999999

+ 0000000000001

4) 뒤에서 먼저 계산하고 앞으로 붙인다

→깔끔하게 계산하기 위해 StringBuilder로 앞에서부터 출력한 뒤 뒤집는다(reverse)

import java.io.*; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder A = new StringBuilder(); StringBuilder B = new StringBuilder(); StringBuilder Sum = new StringBuilder(); //Sum은 값을 계산할 곳 int a=0; int b=0; int c =0; //a, b, c는 반복문 안에서 각 자리수의 숫자를 가져오는 변수 boolean upper = false; // 각 자리수의 합이 10이 넘으면 upper값이 켜지고 다음 자리수가 1 올라간다 StringTokenizer st = new StringTokenizer(br.readLine(), " "); A.append(st.nextToken()).reverse(); B.append(st.nextToken()).reverse(); int lengthA = A.length(); int lengthB = B.length(); int gap = lengthA-lengthB; int length; //더 큰 길이를 가져온다 if(gap>=0) { for(int i=0; i=10) { c -=10; upper = true; } Sum.append(c); } if(upper==true) { Sum.append(1); } //끝자리에서 값이 10을 넘었다면 1을 추가해준다 System.out.println(Sum.reverse().toString()); //계산한 값을 뒤집어서 출력한다 } }

from http://devyoseph.tistory.com/58 by ccl(A) rewrite - 2021-10-13 07:28:06