Problem 89
できるだけ綺麗に書こうとしましたが、微妙です。
解法
実装する
ソース
#include <iostream> using namespace std; int rd(char c){ if(c=='I')return 1; if(c=='X')return 10; if(c=='C')return 100; if(c=='M')return 1000; if(c=='V')return 5; if(c=='L')return 50; return 500; } int toN(const string& s){ int ans = 0,pos = 0,l = s.size(),a,b; while(pos<l){ switch(a = rd(s[pos])){ case 1: case 10: case 100: if(pos+1<l){ b = rd(s[pos+1]); if(a*5==b||a*10==b){ ans += b-a; pos++; break; } } default: ans += a; } pos++; } return ans; } int d(int& a, int div, int cn){ int ans = a/div*cn; a %= div; return ans; } int R(int a){ int ans = 0; for(int i = 100; i; i/=10)ans += d(a,i*10,1)+d(a,i*9,2)+d(a,i*5,1)+d(a,i*4,2); return ans + a; } int main(){ int ans = 0; string s; while(cin>>s)ans += s.size() - R(toN(s)); cout<<ans<<endl; return 0; }