[C] BOJ 10757번: 큰 수 A+B

ㅎㅎ·2023년 1월 2일
0

BOJ

목록 보기
1/65
post-thumbnail

BOJ 10757번: 큰 수 A+B

문제

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

입력

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

출력

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



틀린 이유

  • 숫자형 변수를 사용했다.
    -> 훨씬 더 큰 자릿수를 다루기 때문에 숫자형 변수를 사용할 수 없다.
  • 계산 시 자릿수가 하나 증가하면, 배열의 인덱스가 한 칸 씩 모두 밀려나야하는 것을 간과했다.
  • ASCII 코드에 대한 이해가 부족했다.
  • 두 수의 자릿수가 다른 경우를 고려하지 않았다.

해결 방법

  1. 문자열 배열을 설정하고 역순으로 바꿔 한 자리 씩 덧셈한다. (자릿수가 다를 경우를 고려)
  2. 덧셈 결과를 reverse 함수를 이용해 다시 역순 정렬한다.
#include <stdio.h>
#include <string.h>

void reverse(char arr[]) { // 역순 정렬하는 함수
  int len = strlen(arr);
  for (int i=0; i<len/2; i++) {
    char temp = arr[i];
    arr[i] = arr[len-i-1];
    arr[len-i-1] = temp;
  }
}

int main() {
    
  char A[10002] = {0};
  char B[10002] = {0};
  char sum[10003] = {0};
  int carry = 0; // 자릿수 올림
  int len = 0;
  scanf("%s %s", A, B);
  //printf("\nA = %s\nB = %s\n", A, B);

  if(strlen(A) > strlen(B)) { len = strlen(A); }
  else { len = strlen(B); } // 더 긴 자릿수를 len으로 할당

  reverse(A);
  reverse(B);
  //printf("\nReverse:\nA = %s\nB = %s\n\n", A, B);
  
  char s;
  for(int i=0; i<len; i++) { // '0' = 48
    if(A[i] == 0) { A[i] = '0'; } // 자릿수가 다를 경우 '0' 할당해주기
    else if(B[i] == 0) { B[i] = '0'; }
    s = A[i] + B[i] + carry;
    //printf("%c + %c + %d = %d\n", A[i], B[i], carry, s);
    if(s > 105) { // 10을 넘을 때
      carry = 1;
      sum[i] = s - 58; // '0'과 '10' 빼주기
      //printf("1) sum[%d] = %c, %d\n\n", i, sum[i], sum[i]);
    }
    else {
      carry = 0;
      sum[i] = s - 48; // '0' 빼주기
      //printf("2) sum[%d] = %c, %d\n\n", i, sum[i], sum[i]);
    }
  }
  
  if(carry == 1) { sum[len] = '1'; } // 올림수 있을 경우
  reverse(sum);
  
  printf("%s", sum);

  return 0;
}

뿌듯하다 *^^*

profile
Backend

0개의 댓글