코딩해요/C

[백준/C언어] 11005번: 진법 변환2

yenas0 2024. 7. 9. 01:15
반응형


알고리즘 정리

1.  변수 선언하고 입력 받기

int N, B;
scanf("%d %d", &N, &B);

 

2. iterator 설정 및 결과 저장할 result 배열 선언

10억 까지 숫자로 주어진다고 했는데 10억을 2진수로 변환해도 30자리 안넘길래 배열 크기를 30으로 함

int i = 0;
char result[30] = { 0 };

 

3. 입력된 숫자(N)가 B보다 클 때 반복되는 while문 작성

while (N >= B)

 

4. N을 B로 나눈 나머지를 result에 저장한 뒤에 iterator를 증가시킴. 이후 N을 B로 나눈 몫의 값으로 초기화함. result 자릿수에 저장시에는 10보다 작으면 숫자 그대로의 ASCII 코드 값으로 저장하고(0의 아스키 코드값이 48이므로 48을 더함) 10이 넘어갈 경우 알파벳 대문자로 저장함(A의 아스키 코드값이 65이므로 10일 때 65가되야하니 55를 더함)

int num = N % B;
if (num < 10)
    result[i] = (char)(num + 48);
else {
    result[i] = (char)(num + 55);
}
i++;
N /= B;

 

5. 가장 높은 자릿수는 반복문에서 처리가 안되기 때문에 따로 처리

if (N < 10)
    result[i] = (char)(N + 48);
 else {
    result[i] = (char)(N + 55);
}
i++;

 

6. 저장된 result 배열은 역순으로 저장되어 있으므로 역순으로 자릿수 출력

for (int j = i - 1; j >= 0; j--)
    printf("%c", result[j]);

 

 

 

 

답안

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

int main(void) {
    int N, B;
    scanf("%d %d", &N, &B);

    int i = 0;
    char result[30] = { 0 };

    while (N >= B) {
        int num = N % B;
        if (num < 10)
            result[i] = (char)(num + 48);
        else {
            result[i] = (char)(num + 55);
        }
        i++;
        N /= B;
    }

    if (N < 10)
        result[i] = (char)(N + 48);
    else {
        result[i] = (char)(N + 55);
    }
    i++;

    for (int j = i - 1; j >= 0; j--)
        printf("%c", result[j]);

    return 0;
}

처음에 10보다 작은 숫자는 그냥 입력해도 되는건줄 알고 했다가 오류가 나서.. 찾아보니 0의 아스키 코드값은 0이아니라 48이어서 안 풀렸었다.

반응형