- 문제
10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.
10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.
A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35- 입력
첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.- 출력
첫째 줄에 10진법 수 N을 B진법으로 출력한다.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N, B;
vector<char> answer;
void fast_io()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
}
int main()
{
fast_io();
cin >> N >> B;
while (N != 0)
{
int num = N % B;
if (num > 9)
{
answer.push_back(num + 55);
}
else {
answer.push_back(num + '0');
}
N = N / B;
}
for (int i = answer.size() - 1; i >= 0; i--)
{
cout << answer[i];
}
return 0;
}
2진법을 구할 때 처럼 B진법으로 계속 나눠주며 몫과 나머지를 기록하고 최종 몫이 1이 될때 몫부터 거꾸로 읽어주면 된다.
10 이상부터는 A,B 와 같이 알파벳 대문자를 사용하므로 아스키 코드 값을 고려해 55, '0'을 더해주면 된다.
숏코딩1 (풀이 방식은 같음)
#include<iostream>
using namespace std;
char s[32];
int main(){
int r,n,i=31;
cin >> n >> r;
while(n){
char c = n%r;
s[--i]=c+(c<10 ? '0' : 'A'-10);
n /= r;
}
cout << s+i;
return 0;
}
숏코딩 2 (배열의 index로 숫자 표현? + 재귀함수 사용 -> O(1)이라 재귀가 가능한 듯 싶다
#include<cstdio>
int i, N, B;
char m[36];
void seq(int n)
{
if(n/B)
seq(n/B);
printf("%c",m[n%B]);
}
int main()
{
for(;i<10;i++)
m[i]=48+i;
for(;i<36;i++)
m[i]=55+i;
scanf("%d%d",&N,&B);
seq(N);
}