阅读 58

罗马转数字

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

文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐