#63. 백준 10757번 문제 풀이: 큰 수 A+B 문제 원본 보기
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. 입력: 첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000) 출력: 첫째 줄에 A+B를 출력한다.
입력/출력
--입력--
9223372036854775807 9223372036854775808
--출력--
18446744073709551615
문제풀이+해설
변수가 담을 수 있는 범위보다 큰 수가 들어왔을 경우 일반 연산이 불가능하다.
C나 C++의 경우 최대 정수범위가 8바이트 정도이다.
문제에서 입력으로 주는 수를 담기에는 턱없이 부족하다.
실제로 long long int 로 변수로 받으면, 범위를 넘어서서 -1 이 된다.
그래서 a + b 결과는 -2 가 된다.

이번 경우는 문자열로 받아서 계산 연산을 구현해서 문자열로 출력해야 한다.
단, 파이썬의 경우는 그대로 더하기 해도 정상적으로 출력된다.
하지만 문제의도에 따라 파이썬도 문자열로 더하기 연산을 하는 것을 구현하도록 하겠다.

루틴은 실제 사람이 계산하는 방법과 같다. 다음과 같이 구현하면 된다.
1. A 문자열과 B 문자열에 숫자를 저장한다.
2. 계산을 쉽게하기 배열 인덱스를 0부터 진행하기 위해, A, B 문자열을 순서를 리버스시킨다.
3. A 와 B의 앞에서 부터 한자리씩, 문자를 하나씩 꺼내서 -'0' 아스키코드 값을 빼주면 십진수가 된다. 더하기를 해준다. 더하기 해서 10 이상이면 올림수를 체크해 둔다.
4. 결과값을 C 배열 같은 자리에 넣는다.
5. 3번을 반복한다. 단 올림수가 있으면 +1을 해준다.
6. 루프가 끝나면 C 문자열을 리버스해서 정상숫자로 만들어 준다.
7. 출력하면 끝.

C언어에서는 문자열 리버스를 직접 구현했음. 문자열 앞과 뒤에서 한 글자씩, 중간위치까지 서로 바꾸어주면 됨.
code sol.
#include <stdio.h>
#include <string.h>

void str_rev(char *s) { // 문자열을 리버스하는 함수 구현
  int i, l = strlen(s);
  char t;
  for(i = 0; i< l / 2; i++) {
    t = s[i]; s[i] = s[l - i - 1]; s[l - i - 1] = t;
  }
}

int main() {
  int i = 0, l_A, l_B, carry = 0, sum;
  char A[10002], B[10002]; 
  char C[10002] = {0}; // 결과를 담을 배열
  
  scanf("%s %s", A, B); // 큰 수 A, B를 문자열로 입력받는다.
  str_rev(A);
  str_rev(B);
  l_A = strlen(A);
  l_B = strlen(B);
  while(i < l_A || i < l_B) { // 제일 긴 문자열까지 루프
    if(i < l_A && i < l_B) { // A + B 덧셈
      sum = (A[i] - '0') + (B[i] - '0');
    } else if(i < l_A) { // A 만 더함
      sum = A[i] - '0';
    } else if(i < l_B) { // B 만 더함
      sum = B[i] - '0';
    }
    sum += carry;
    carry = 0; // 올림수 초기화
    if(sum>9) { // 10 이상이면 올림수 발생
      carry = 1;
      sum -= 10;
    }
    C[i] = sum + '0'; // 더한 값을 문자로 만들어 넣어줌.
    i++;
  }
  if(carry > 0) C[i] = '1'; // 마지막 올림수 있으면 처리
  str_rev(C); // 문자열을 원래대로 리버스
  printf("%s", C); // 결과값 문자열로 출력
  return 0;
}
© 코드솔 - CodeSol. All Rights Reserved.