

B 진법 수를 입력받아서 10진수로 출력하는 문제이다.
이 문제의 핵심은
(1) B 진법 -> 10진법 계산을 위한 누적 방식
(2) char가 문자인지 숫자 인지 확인
이다.
#include <iostream>
#include <string>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s;
int B;
int sum = 0;
cin >> s >> B;
int len = s.size();
for(int i=len; i>0; i--) {
if(s[len-i] >= '0' && s[len-i] <= '9') {
sum+= (s[len-i]-'0') * B^(i-1);
} else {
sum+=(s[len-i]-'A'+10) * B^(i-1);
}
}
cout << sum;
}
왜 틀렸나 했는데, 바보같이 지수 연산자를 ^로 착각했다.
C++ 에서 ^는 비트 xor 이다.
나는 바보같이 비트 xor을 계속 해주고 있었다.
C++ 에서 지수 연산을 위해서는 pow() 함수를 사용해야한다.
#include <cmath>
double r = pow(a, b); // a의 b제곱
pow 함수는 위와 같이 사용한다.
이를 적용하면 아마 옳은 답이 나오지않을까싶다.
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s;
int B;
int sum = 0;
int digit;
cin >> s >> B;
for(char c : s) {
if(isalpha(c)) digit = c-'A'+10;
else digit = c-'0';
sum = sum*B + digit;
}
cout << sum;
}
우선, char가 문자인지 숫자인지 확인은 <cctype>의 isalpha() 함수를 사용했고,
누적은 sum = sum * B + digit 으로 매 반복마다 B가 곱해지도록 하였다.
가장 큰 자릿수부터 반복을 실행하기때문에 위의 방식대로 매 반복마다 B가 곱해져야
10진수 변환이 제대로된다.
sum = sum * B + digit 으로 매 반복마다 B를 곱하며 10진수로 변환하는 코드는 외워놓으면 아이디어적 측면에서 유용하게 쓸 수 있을 것 같다.
isalpha() 안쓰고 if ('0' <= c && c <= '9') 이렇게 하는 방법도 존재한다.
둘 중 뭘쓰든 관계없을듯하다.