해당 문제는 입력받은 10진수를 원하는 진법으로 변경 후 출력하면 되는 문제이다.
진법을 변환할때 가장 간단한 방법은 입력받은 10진수를 원하는 진법만큼 나눈 몫으로 표현하면 된다.
수가 10을 넘어가면 문자(A~Z)로 표현한다.
나는 해당 문제를 배열을 하나 만든 후 입력받은 10진수를 원하는 진법만큼 계속 나누어 몫을 배열에 저장한 후 배열에 저장된 수를 하나씩 출력하는 방법을 이용했다.
* 진법은 36진법까지 표현 가능하다.
#include <stdio.h>
int main() {
// n = 10진수, d = 입력받은 10진수의 복사본
long long int n, d;
// b = b진법, i = 인덱스, a = b진법 수를 담고있는 배열
int b, i=0, a[31];
// n & b 를 받는다.
scanf("%lld %d", &n, &b);
// d 에 n의 값을 넣는다.
d=n;
// 반복
while(1) {
// d를 모두 나누어 0보다 작거나 같을 경우
if(d<=0) {
// a배열의 현재 인덱스(i)에 d값을 넣는다.
a[i] = d;
// 반복문 탈출
break;
}
// a배열의 인덱스(i)에 입력받은 10진수를 원하는 진법만큼 나눈 몫의 값을 넣는다.
a[i] = d % b;
// 입력받은 10진수를 원하는 진법만큼 나눈다.
d = d / b;
// 인덱스 증가.
i++;
}
/// 마지막 인덱스부터 0번째 인덱스까지 역으로 순회
for(int j=i-1; j>=0; j--) {
// 배열에 저장된 수가 문자로 표현하지 않아도 될 경우
if(a[j] >= 0 && a[j] <= 9) {
// 정수로 해당 배열 값 출력
printf("%d", a[j]);
}else{
// 배열에 저장된 수의 크기가 9를 넘어가 문자로 표현해야 할 경우
// 배열에 저장된 값에 55를 더해 아스키코드로 변경 후 문자로 출력
printf("%c", (char)(a[j]+55));
}
}
return 0;
}
이번 문제는 진법에 대한 이해만 있다면 쉽게 풀 수 있을 것 같다.