
10진법 -> n진법으로 변환하는 문제이다.
(1) 10진법 -> n진법 변환법 알기
(2) 나머지가 10보다 크면 문자로 출력하기
(3) 문자를 출력해야하니 -> string 사용
이렇게 3개가 이 문제의 핵심이다.
우선, 10진법 -> n진법은 아래와 같이 변환한다.

쉽게 말해서 N/B가 0이될때까지 나누기를 수행해주고, 각 나누기 단계에서 나온 나머지 N % B 를 역순으로 출력해주면 된다.
// N=39, B=2 32+4+2+1 -> 100111
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s="";
int N,B;
char tmp;
int rem;
cin >> N >> B;
while (N>=B) { //2>=2
rem = N%B; //rem=0
N = N/B; //N=1
if(rem>=10) tmp=(char)(rem-10+'A'); //
else tmp=rem+'0';
s.push_back(tmp); // 111001
}
if(N>=10) tmp =(char)(N-10+'A');
else tmp=N+'0';
s.push_back(tmp);
reverse(s.begin(), s.end());
cout << s;
return 0;
}
나는 N>=B인동안만 나누기를 수행하고 마지막에 N을 덧붙여주는 식으로 코드를 작성했다.
또한, 역순 출력을 위해 s.reverse()를 사용하였다.
다른 풀이를 본 상태에서 나의 풀이를 보면 항상 비효율적이고, 불필요하게 코드 길이만 늘리는 코드가 정말 많은 것 같다.
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int N, B, rem;
string s="";
cin >> N >> B;
while(N>0) {
rem=N%B;
N = N/B;
rem >= 10 ? s+=char(rem-10+'A') : s+=char(rem+'0');
}
for(int i=s.size()-1;i>=0;i--) cout << s[i];
return 0;
}
한 눈에 봐도 매우 매우 매우 매우 매우 간결하다.
핵심적인 원리는 동일하다.
다만, 나누기를 N이 0이될때까지 반복문에서 수행하고 , 마지막에 reverse()안쓰고 인덱스 역순으로 string을 순회하며 출력한다는 것이 차이점이다.
+ 연산시 char -> string 형 변환s+=char(rem+'0')
위와 같이 string과 char를 + 연산시 char -> string 으로 형 변환된다.
굳이 reverse() 쓸 필요 없다. 그냥 string을 역순으로 순회해주면 된다.
string을 비어있는 상태로 초기화하려면
string s1 = "";
으로 초기화해주면 된다.