본문 바로가기
💎 백준/🎇 C언어

[C언어] 백준 2745번 진법 변환

by mildliner 2024. 2. 11.

진법 변환

문제

 

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다.

이런 경우에는 다음과 같이 알파벳 대문자를 사용한다. A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

 

입력

 

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)

B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.

 
출력

 

첫째 줄에 B진법 수 N을 10진법으로 출력한다.

예제 입력 1
ZZZZZ 36

 

예제 출력 1
60466175
제출 코드
#include <stdio.h>
#include <math.h>
#include <string.h>

int main() {
    char input[100]; // 사용자로부터 입력받을 문자열을 저장할 배열
    int result = 0; // 최종적으로 계산될 10진수 결과를 저장할 변수
    int n, len, num[100]; // n은 사용자로부터 입력받은 진법, len은 입력 문자열의 길이, num은 각 자릿수의 숫자 값을 저장할 배열

    scanf("%s %d", input, &n); // 사용자로부터 진법 변환할 숫자(문자열 형태)와 진법을 입력받음
    len = strlen(input); // 입력받은 문자열의 길이를 계산

    for (int i = 0; i < len; i++) {
        num[i] = (int)input[i]; // 문자열의 각 문자를 아스키 코드로 변환
        if (num[i] > 64) // 문자가 A부터 Z인 경우 (아스키 코드에서 대문자 A는 65)
            num[i] -= 55; // A는 10, B는 11, ... 이 되도록 조정 ('A'의 아스키 코드 값인 65에서 55를 빼면 10이 됨)
        else
            num[i] -= 48; // 문자가 0부터 9인 경우 (아스키 코드에서 '0'은 48)
    }
    
    int size = len-1; // 가장 높은 자리수의 지수를 계산 (예: 16진수의 FAB에서 A의 지수는 1)
    for (int i = 0; i < len; i++) {
        num[i] *= pow(n, size); // 각 자리의 숫자에 해당하는 값을 계산 (진법^n * 자리값)
        size--; // 다음 자릿수로 이동하며 지수 감소
    }

    for (int i = 0; i < len; i++) {
        result += num[i]; // 모든 자릿수의 값을 더해 최종 결과 계산
    }

    printf("%d", result); // 계산된 10진수 결과 출력
    return 0;
}