문제

진법변환 백준 2745번


리뷰

B진법 수 N을 10진법으로 바꿔서 출력하는 프로그램 작성하기.

B진법은 2진법 부터 최대 36진법까지 입력된다.

N을 10진법으로 바꾸면 항상 10억보다 작거나 같다.


문자열로 N을 입력받고, 마지막 자리 문자 부터 B의 0승, B의 1승, B의 2승... 이렇게 곱해서 누적한 결과를 출력했다.

string 을 char 배열로 바꾸는 것은 cstring 의 strcpy 를 이용했다.

#include <cstring>
#include <string>

string N;
char ch[30];
strcpy(ch, N.c_str()); // string 을 char N에 복사  

*문자 '9'는 57에 대응하고 문자 'A'는 65 임을 이용했다. *

    if('9' < ch[i]){ // 알파벳으로 표현한 경우, A는 65임을 이용 
        answer = answer + ( pow(B, n) * (ch[i]-55) );
    }else{ // 문자 '9'는 57임을 이용 
            answer = answer + ( pow(B, n) * (ch[i]-48) );
    }

char 배열 길이 때문에 런타임 에러 발생

string 을 char 배열로 변환해서 쓰는 부분에서 런타임 에러를 이 글을 읽고 도움받았다.

예를 들어, 2진법이면 0과 1밖에 표현 안하니까 다른 진법에 비해 문자열이 길게 들어올 것이다.

N은 항상 10억보다 작거나 같다. 10억 ( 1,000,000,000)을 2진수으로 표현하면

0011 1011 1001 1010 1100 1010 0000 0000

따라서 char 배열은 30자리 이상으로 만드는 것이 안전하다.


맞은 코드

#include <iostream> 
#include <string>
#include <cstring> // strcpy()
#include <cmath> // pow()
using namespace std;

string N;
char ch[30];
int B, answer;

int main(void){

    cin >> N >> B;

    strcpy(ch, N.c_str()); // string 을 char N에 복사  
    int n = 0; // B의 자승 표현을 위한 변수 

    for(int i = N.length()-1; i >= 0; i--){

        if('9' < ch[i]){ // 알파벳으로 표현한 경우, A는 65임을 이용 
            answer = answer + ( pow(B, n) * (ch[i]-55) );
        }else{ // 문자 '9'는 57임을 이용 
            answer = answer + ( pow(B, n) * (ch[i]-48) );
        }
        n++;
    }

    cout << answer;

    return 0;    
} 

백준 질문게시판에 글 올려주시고 댓글 달아주시는 분들 모두 다 감사하다.

728x90

'알고리즘 > 백준' 카테고리의 다른 글

8진수 2진수 백준 1212번  (0) 2020.09.16
2진수 8진수 백준 1373번  (0) 2020.09.15
진법변환2 백준 11005번 c++  (0) 2020.09.15
GCD합 백준 9613번  (0) 2020.09.15
조합 0의 개수 백준 2004번  (0) 2020.09.15

+ Recent posts