srupのメモ帳

競プロで解いた問題や勉強したことを記録していくメモ帳

Clash of Code 2進数から16進数変換

問題概要

codingameの中のClash of Codeで書いたもの。2進数を16進数に変換せよて問題だった。c++だとどう書くのが早いのか。0b0110のようなクエリが与えらるので、0x6 と答えるような問題。1度10進数に変換したほうがいいか。 競プロとかで出てもおかしくないので、メモしておく。

コード

AC

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
#define rep(i,n) for(int i=0;i<(n);i++)

int main(void){
    //0b01011010
    string s; cin >> s;
    string t = s.substr(2);
    int u = (4 - t.size()) % 4;
    rep(i, u) t = '0' + t;

    string ans = "0x";
    for (int i = 0; i < t.size(); i += 4){
        string v = t.substr(i, 4);
        if(v == "0000") ans += '0';
        else if(v == "0001") ans += '1';
        else if(v == "0010") ans += '2';
        else if(v == "0011") ans += '3';
        else if(v == "0100") ans += '4';
        else if(v == "0101") ans += '5';
        else if(v == "0110") ans += '6';
        else if(v == "0111") ans += '7';
        else if(v == "1000") ans += '8';
        else if(v == "1001") ans += '9';
        else if(v == "1010") ans += 'a';
        else if(v == "1011") ans += 'b';
        else if(v == "1100") ans += 'c';
        else if(v == "1101") ans += 'd';
        else if(v == "1110") ans += 'e';
        else if(v == "1111") ans += 'f';
    }
    cout << ans << endl;//0x5a
    return 0;
}