zoukankan      html  css  js  c++  java
  • 罗马转数字

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


  • 相关阅读:
    K近邻法(KNN)原理小结
    scikit-learn决策树算法类库使用小结
    朴素贝叶斯算法原理小结
    scikit-learn 支持向量机算法库使用小结
    Socket原理与编程基础
    实时获取股票信息API
    微信内部浏览器私有接口
    外汇哦,你懂的。
    股票数据源-股票代码和名称数据格式
    用Simple Html Dom Parser 获取中国银行汇率
  • 原文地址:https://www.cnblogs.com/lexus/p/2588754.html
Copyright © 2011-2022 走看看