본문 바로가기
컴퓨터/C, C++

[C/C++] 백준 10757번 C언어

by stdFrog 2022. 6. 6.

백준 10757번


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

 

입력

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

 

출력

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

 

#include <stdio.h>

#define Result(a,b) {int n; n=a, a=b, b=n;}

void Reverse(char *ar, int length){
        int left, right;
        for(left=0,right=length-1; ; left++,right--){
                if(left>=right){break;}
                Result(ar[left], ar[right]);
        }
}

int main()
{
        // 1이상, 10^9999이하 값(올림 시 10^10000포함) + '\0'
        char arA[10001], arB[10001];
        int i,j;

        // 입력받고
        scanf("%s %s", &arA, &arB);

        // 십진수(정수)로 변환, NULL 종료 문자 만날 때까지 반복
        for(i=0; *(arA+i); i++){
                arA[i]-='0';
        }
        for(j=0; *(arB+j); j++){
                arB[j]-='0';
        }

        // 계산식 쉽게 만들기 위해 배열 뒤집고
        Reverse(arA, i);
        Reverse(arB, j);

        // 길이가 더 긴거 찾고
        i= i>=j ? i: j;

        // 값 계산
        for(j=0; j<i; j++){
                arA[j]= arA[j]+arB[j];
                if(arA[j]>=10){
                        arA[j+1]+=1;
                        arA[j]%=10;
                }
        }

        // 마지막 값이 널 종료 문자와 다른 경우 즉, 길이가 늘어났을 때의 예외 처리
        // C의 문자형 배열은 값이 할당된 부분을 제외하곤 전부 널 종료 문자로 채워진다.
        if(arA[i]!='\0'){i++;}

        // 출력 전 다시 배열 뒤집기
        Reverse(arA, i);

        // 문자형으로 변환
        for(j=0; j<i; j++){
                arA[j]+='0';
        }

        //마지막 출력
        printf("%s", arA);
}

 

주석에 간단하게 설명을 적어뒀다.

 

참고로 입력값은 최대 10^9999이지만 두 값을 더했을 땐 10^10000 이상이 될 수 있다.

여기에 널 종료문자까지 포함해야 되므로 10001의 크기를 갖는 배열을 선언한 것이다.

 

아래 계산식은 사람이 계산하는 것처럼 일의 자리부터 더한 후 다음 자릿수에 값을 올림 하는 아주 간단한 형태이므로 따로 설명이 필요 없을 것 같다.

 

배열의 크기가 늘어난 경우, 널 종료문자(ASCII 0)에 +=1 즉, 1이란 정수 값을 가지므로 if(arA[i]!='\0')만으로도 예외처리가 가능하다.

반응형

'컴퓨터 > C, C++' 카테고리의 다른 글

[C/C++] 백준 2581번 C언어  (0) 2022.06.07
[C/C++] 백준 1978번 C언어  (0) 2022.06.07
[C/C++] 백준 2839번 C언어  (0) 2022.06.03
[C/C++] 백준 2775번 C언어  (2) 2022.06.02
[C/C++] 백준 10250번 C언어  (0) 2022.06.01

댓글