Beta Round #57-C: Capture Valerian

解法

基数変換するだけ。ローマ数字じゃないときは入力に0があることに注意。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char line[1009];
int table[0x100];
char tochar[30];
char ans[1009], tmp[1009];

void setTable(){
    char c;
    int i;
    for(c='0'; c<='9'; c++)
        table[c] = c&15;
    for(c='A'; c<='Z'; c++)
        table[c] = c - 'A' + 10;
    for(i=0;i<10;i++)
        tochar[i] = '0' + i;
    for(i=0;i<20;i++)
        tochar[i+10] = 'A' + i;

}

long long parse(int a){
    long long num = 0, base = 1;
    int i;
    for(i=strlen(line)-1;i>=0;i--){
        num += table[line[i]]*base;
        base *= a;
    }
    return num;
}

void solve1(int a, int b){
    long long num = parse(a);
    if(!num){
        puts("0");
        return ;
    }
    int p=0,i;
    while(num){
        tmp[p++] = tochar[num%b];
        num /= b;
    }
    for(i=0;i<p;i++){
        ans[i] = tmp[p-1-i];
    }
    ans[p] = '\0';
    puts(ans);
}

void solve2(int a){
    int num = parse(a), i, p;
    for(i=0; i<num/1000; i++)
        strcat(ans,"M");
    num %= 1000;
    p = num/100;
    if(p>=5){
        if(p==9){
            strcat(ans,"CM");
        }
        else{
            strcat(ans,"D");
            for(i=5;i<p;i++)
                strcat(ans,"C");
        }
    }
    else{
        if(p==4){
            strcat(ans,"CD");
        }
        else{
            for(i=0;i<p;i++)
                strcat(ans,"C");
        }
    }
    num %= 100;
    p = num/10;
    if(p>=5){
        if(p==9){
            strcat(ans,"XC");
        }
        else{
            strcat(ans,"L");
            for(i=5;i<p;i++)
                strcat(ans,"X");
        }
    }
    else{
        if(p==4){
            strcat(ans,"XL");
        }
        else{
            for(i=0;i<p;i++)
                strcat(ans,"X");
        }
    }
    num %= 10;
    p = num;
    if(p>=5){
        if(p==9){
            strcat(ans,"IX");
        }
        else{
            strcat(ans,"V");
            for(i=5;i<p;i++)
                strcat(ans,"I");
        }
    }
    else{
        if(p==4){
            strcat(ans,"IV");
        }
        else{
            for(i=0;i<p;i++)
                strcat(ans,"I");
        }
    }
    puts(ans);
}

int main(){
    int a, b;
    setTable();
    scanf("%d ",&a);
    scanf("%s ",line);
    if(!strcmp(line,"R")) b = -1;
    else b = atoi(line);
    scanf("%s ",line);
    b>=0?solve1(a,b):solve2(a);
    return 0;
}