코딩/백준 문제 (브론즈)

[백준/2745/C언어] 진법 변환 _ 풀이

룻밤 2023. 8. 9. 15:26

https://www.acmicpc.net/problem/2745

 

2745번: 진법 변환

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 

www.acmicpc.net


풀이

#include <stdio.h>

int main() {
	char n[31];		// b진법 수 n 
	int b;			// b진법
	long long total = 0;	// 10진법으로 바꾼 수(int형의 범위를 벗어날수있음)
	int i = 0;
	scanf("%s %d", &n, &b);
	
	while (n[i] != '\0') {		// n문자열이 끝날때까지 반복
		total *= (long long)b;	// total = (total*b) + n[i] (호너법)
		if (n[i] >= 'A' && n[i] <= 'Z') {	// 문자열이 A부터 Z까지일때
			total += n[i] - 55;		// A~Z까지 아스키코드와의 차가 55
		}
		else						// n[i]가 숫자일때
			total += n[i] - '0';	// total = (total*b) + n[i] (호너법)
		i++;		// i 1씩 증가
	}
	printf("%lld\n", total);		// 10진법 변환 값 출력

	return 0;
}

n 배열이 31자리까지인 이유 :

b진법의 최솟값은 2일때 n을 10억이하 근사로 표현하면 2^30 = 1,073,741,824이다.

문자열의 마지막 널문자(\0)까지 포함하여 31칸 배열을 만든다.

 

호너법 공부 필수

f(x) = (f * x) + a[i]