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

[Jungol] 정올 3106 진법 변환

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

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

Approach

11 진법 부터는 0 ~ 9, A ~ Z 까지 대문자를 사용합니다.

(수가 int 범위를 초과할 수 있음에 유의)

 

▶ A 진법의 수 → 10진법 수 → B진법 수

 

※ 변환 과정에서 Horner’s method 이용

 

2진수 1101을 자리수별 가중치를 주어 10진수로 나타내면 아래와 같다.

1101 = 0 * 24 + 1 * 23 + 1 * 22 + 0 * 21 + 1 이므로

         = (((0*2 + 1) * 2 + 1) * 2 + 0) * 2 + 1 = 1310


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

typedef long long LL;
int A, B;
char str[70];
char toChar(int r) {
    if (r < 10) return r + '0';
    return r + 'A' - 10;
}

void convert(LL d) {
    if (d < B) {
        printf("%c", toChar(d));
        return;
    }
    convert(d / B);
    int r = d % B;
    printf("%c", toChar(r));
}

int main() {
    // freopen("input.txt", "r", stdin);
    while (scanf("%d %s %d", &A, str, &B) && A) {
        LL d = 0;
        // A 진법수 > 10진법수
        for (int i = 0; str[i]; ++i) {
            /*
            if(str[i] < 'A') d = d*A + str[i] - '0';
            else d = d*A + str[i] - 'A' + 10;
            */
            d = d * A + str[i] - 48 - (str[i] > '9') * 7;
        }
        
        // 10진법수 > B진법수
        convert(d);
        puts("");
    }
}

 

반응형

댓글