본문 바로가기
PS 문제 풀이/Jungol

[Jungol] 정올 1374 긴 자릿수 덧셈 뺄셈

by 까망 하르방 2021. 3. 16.
반응형

출처: http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=649&sca=50

Approach

Input Data가 200자리이기 때문에 정수형으로 받을 수 없습니다.

 

두 수를 각각 숫자 배열의 맨 끝(200번)부터 차례대로 넣습니다.

뺄셈 연산을 위해 큰 수를 첫번째 배열에, 달느 수를 두번째 배열에 넣습니다.

ex) 6789, 12345

 

① 최대 배열 크기 200에 맞추어 Data를 우측배열 시킵니다.

    Input Data를 문자열로 받았기 때문에 int형으로 전환

 

② ± 연산에 따라 값을 처리합니다.

    +: 두 수를 더해서 10이상인 경우 다음 자리에 +1 처리.

    -: 두 수를 빼서 음수인 경우 앞자리에서 도움수를 받습니다.

        (A ≥ B 이므로 마지막 단계에서 오류가 나지 않습니다.)


#include <stdio.h>
 
int strLen(char *str){
    int len = 0;
    while(str[len]) len++;
    return len;
}
 
int comp(char *a, char* b){
    int an = strLen(a), bn = strLen(b);
    if(an != bn) return an > bn;
    for(int i=0; i<an; i++){
        if(a[i] != b[i]) return a[i] > b[i];
    }
    return 1;
}
 
void encode(char *a, int *A){
    // A[] 끝에서부터 a[] 배열길이 만큼 채워갑니다.
    for(int i=strLen(a) - 1, j=200; i>=0; i--, j--){
        A[j] = a[i] - 48;
    }
}
 
void output(int *A){
    int i;
    // 앞쪽에 비워져 있는 부분 생략
    for(i=0; i<200; i++)
        if(A[i]) break;
 
    for(; i<=200; i++) printf("%d", A[i]);
    printf("\n");
}
 
void process(char *a, char* b){
    int A[210] = {0}, B[210] = {0};
    int sum[210] = {0}, sub[210] = {0};
    // 배열크기 200으로 설정해서 우측배열 시키기
    encode(a, A); encode(b, B);
 
    for(int i=200; i>0; i--){
        sum[i] += A[i] + B[i];
        // 올림수 처리
        if(sum[i] >= 10){
            sum[i-1]++;
            sum[i] -= 10;
        }
 
        sub[i] += A[i] - B[i];
        // 7 - 9 = -2와 같은 경우
        if(sub[i] < 0){
            sub[i-1]--;
            sub[i] += 10;
        }    
    }
 
    output(sum); output(sub);
}
 
int main(){
    char astr[210], bstr[210];
    while(1){
        scanf("%s %s", astr, bstr);
        if(astr[0] == '0' && bstr[0] == '0')
            break;
        if(comp(astr, bstr))
            process(astr, bstr);
        else
            process(bstr, astr);
    }
}

 

반응형

댓글