// Roman2Arabic.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <map>
#include <string>
#include <iostream>
#include <vector>
//#include <locale.h>
using namespace std;
int get_max_postive_integer(int i)
{
if(i<=0)return i;
int a[]={1,2,3,4,5,6,7,8,9,10,40,50,90,100,400,500,900,1000};
int len=sizeof(a) / sizeof(int);
for(int j=0;j<len;j++)
{
int r=(i-a[j]);
if(r==0)
{
return i;
}
else if(r<0)
{
if((j-1)>=0)
{
return a[j-1];
}
}
else if(r>0 && j==(len-1))
{
return a[j];
}
}
}
vector<int> get_integer_combine_list(int i)
{
cout<<"%%%%%%%%%%"<<endl;
cout<<i<<endl;
vector<int> vList;
int input=i;
cout<<input<<"<--input"<<endl;
int r=get_max_postive_integer(input);
cout<<"r=>"<<r<<endl;
vList.push_back(r);
while(r!=input)
{
input=input-r;
r=get_max_postive_integer(input);
cout<<"r=>"<<r<<endl;
//if(r!=input)
vList.push_back(r);
}
return vList;
}
string arabic2roman(int i)
{
map<int,string> arabic_roman_map;
arabic_roman_map[2]="II";
arabic_roman_map[3]="III";
arabic_roman_map[6]="VI";
arabic_roman_map[7]="VII";
arabic_roman_map[8]="VIII";
arabic_roman_map[1]="I";
arabic_roman_map[4]="IV";
arabic_roman_map[5]="V";
arabic_roman_map[9]="IX";
arabic_roman_map[10]="X";
arabic_roman_map[40]="XL";
arabic_roman_map[50]="L";
arabic_roman_map[90]="XC";
arabic_roman_map[100]="C";
arabic_roman_map[400]="CD";
arabic_roman_map[500]="D";
arabic_roman_map[900]="CM";
arabic_roman_map[1000]="M";
vector<int> vList=get_integer_combine_list(i);
string r="";
for(std::vector<int>::iterator j=vList.begin();j!=vList.end();++j)
r += arabic_roman_map[*j];
return r;
}
int _tmain(int argc, _TCHAR* argv[])
{
//int i=39;
////cout<<"TTTTTT"<<endl;
////cout<<i<<endl;
////cout<<get_max_postive_integer(i)<<endl;
//vector<int> temp=get_integer_combine_list(i);
//for(std::vector<int>::iterator j=temp.begin();j!=temp.end();++j)
//{
// cout<<"ZZZZZZZZZZZZZZ"<<endl;
// cout<<*j<<endl;
//}
//cout<<"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"<<endl;
string aa="大家风范";
string test="IV";
char s[20];
while(true){
gets(s);
char ss[20];
strcpy(ss,s);
for(int i=0;i<strlen(ss);i++)
{
ss[i]=(char)toupper(ss[i]);
}
//cout<<s;
map<char,int> roman_arabic_map;
roman_arabic_map['I']=1;
roman_arabic_map['V']=5;
roman_arabic_map['X']=10;
roman_arabic_map['L']=50;
roman_arabic_map['C']=100;
roman_arabic_map['D']=500;
roman_arabic_map['M']=1000;
bool isValid=true;
vector<int> vList;
for(int i=0;i<strlen(s);i++)
{
if(roman_arabic_map.find((char)toupper(s[i]))!=roman_arabic_map.end())
{ char k=(char)toupper(s[i]);
int v=roman_arabic_map[k];
cout<<v<<endl;
//std::wcout<<"中国"<<endl;
if(vList.size()>=3)
{
int pre1=vList.at(vList.size()-1);
int pre2=vList.at(vList.size()-2);
int pre3=vList.at(vList.size()-3);
if(pre1==v && pre2==v && pre3==v)
{
cout<<"invalid!,same character repeat more than three times"<<endl;
isValid=false;
break;
}
}
if(vList.empty() || vList.back()>=v)
{
vList.push_back(v);
}
else
{
if((k=='V' || k=='X') && roman_arabic_map['I']!=vList.back())
{
cout<<k<<"zzz"<<endl;
cout<<"V 和X 左边的小数字只能用Ⅰ"<<endl;
isValid=false;
break;
}
if((k=='L' || k=='C') && roman_arabic_map['X']!=vList.back())
{
cout<<"L 和C 左边的小数字只能用X。"<<endl;
isValid=false;
break;
}
if((k=='D' || k=='M') && roman_arabic_map['C']!=vList.back())
{
cout<<"D 和M 左边的小数字只能用C。 "<<endl;
isValid=false;
break;
}
int preElem=vList.back()*(-1);
vList.pop_back();
vList.push_back(preElem);
vList.push_back(v);
if (vList.size()>=3){
int pre1=vList.at(vList.size()-1);
int pre2=vList.at(vList.size()-2);
int pre3=vList.at(vList.size()-3);
//cout<<(pre1+pre2+pre3)<<"dd";
if((pre1+pre2+pre3)<=pre1)
{
cout<<"invalid format!\n";
isValid=false;
break;
}
}
}
if(vList.size()>=2){
int pre1=vList.at(vList.size()-1);
int pre2=vList.at(vList.size()-2);
//cout<<pre1<<endl;
//cout<<pre2<<endl;
if((pre1==pre2) && (pre1==50 || pre1==500))
{
cout<<"invalid format!"<<endl;
isValid=false;
break;
}
}
}
else
{
cout<<"invalid! character:"<<s[i]<<endl;
isValid=false;
break;
}
}
if (isValid){
int sum_of_elems=0;
for(std::vector<int>::iterator j=vList.begin();j!=vList.end();++j)
sum_of_elems += *j;
cout<<"==============\n"<<sum_of_elems<<endl;
cout<<arabic2roman(sum_of_elems)<<endl;
if (arabic2roman(sum_of_elems)==(string)ss)
{
cout<<"the same"<<endl;
}
else
{
cout<<"not right"<<endl;
}
}
}
return 0;
}