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; }