본문 바로가기
[백준]

[BaekJoon/백준] 10757번

by Hevton 2021. 1. 29.
반응형

큰 수 A + B 문제.

 

10000자리 이상의 큰 수에 대한 덧셈에서, C/C++에선 어떻게 처리할 수 있을지에 대한 방법이다.

문자열로 값을 받아서 다뤄주면 된다.

 

풀고 나서 다른 분들의 풀이를 참고해봤더니, 비슷한 방식이였다.

결국 마지막 올림수(맨 앞자리 올림수) 여부에 대한 처리로 if 문을 넣어주는 방식은 동일했다.

 

세 배열 모두 char로 선언하신 분들도 많았는데, 그런 방식으로도 가능하겠다.

// 다 내 코드처럼 올림수에대한 분기문은 마지막에 작성하고있고(if부분), 구분 방법이 나랑은 조금 다를뿐.

#include <stdio.h>
#include <string.h>

char a[10001];
char b[10001];
int ans[10001]; // 덧셈값을 쉽게 저장하기 위해서, 그리고 올림값을 잘 처리하기 위해서 int로 선언. 기존 값(=올림결과값 0 or 1) + 덧셈값 = 저장값.
int a_len, b_len;

int main() {
    
    
    scanf("%s %s", a, b);
    
    a_len = strlen(a) - 1;
    b_len = strlen(b) - 1;
    
    int x, y, temp, c = 0;
    
    // 두 값의 인덱스 모두가 음수가 될때까지 진행하며, 먼저 음수가 된 인덱스가 있다면 해당 값은 0으로 덧셈 진행.
    // 두 수의 덧셈은 일의자리부터인 배열 끝에서부터 시행하나, 저장시에는 앞에서부터 저장한 뒤 뒤에서부터 출력하여 결과를 얻어냄.
    while(a_len >=0 || b_len >=0) {
        
        x = (a_len>=0)?(a[a_len]-'0'):0;
        y = (b_len>=0)?(b[b_len]-'0'):0;
        
        temp = ans[c] + x + y; // 올림값이 없다면 0 + x + y가 되고, 있다면 올림값 + x + y가 되는것.
        ans[c] = temp%10;
        ans[c + 1] = temp/10;
        
        c++;
        a_len--;
        b_len--;
    }
    
    // 마지막 덧셈=맨 앞자리 덧셈의 올림여부에 대한 처리.
    if(ans[c] == 0)
        c--;
    
    // 뒤에서부터 출력.
    for(;c>=0;c--)
    printf("%d", ans[c]);
}

반응형