您的位置:首页 > 其它

阿拉伯数字转换成罗马数字

2017-02-25 19:18 267 查看
问题:

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

问题分析:

罗马数字有如下的符号代表:I(1),V(5),X(10),L(50),C(100),D(500),M(1000)

罗马数字都有如下的计数规则:

1.小数字符号在大数字符号前面表示减,例如:IV=5-1=4;

2.小数字符号在大数字符号后面表示加,例如:VI=5+1=6;

3.若干个相同符号连写表示这些符号代表的数相加,例如:III=1+1+1=3;

同样也具有如下的组合规则:

1.基本数字I、X、C中的任何一个,自身连用 构成的数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数左边的只能一个。

2.不能把基本数字V、D、L中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使
用一个。

3.V和X左边的小数只能用 I。

4.L和C左边的小数只能用X。

5.D和M左边的小数只能用C。

代码编写分析:

把所有小数字在前的组合也作为基本数字,做一个对应的映射表

比如:IV=1-5=4;IX=1-10=9;XL=10-50=40;XC=10-100=90;CD=100-500=400;CM=100-1000=900。

因此可以得到对应的映射:

unsigned int val[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};

string r[]={"M","CM","D”,“CD”,"C","XC”,"L","XL","X","IX",V","IV","I"}

首先定义一个string re,对于阿拉伯数字num,遍历数组val,如果num>=val[i],则结果保留r[i],做操作re+=r[i],同时更新num=num-val[i],直到num=0为止。

代码如下:

class Solution {

public:

    string intToRoman(int num) {

        string re="";

        if(num<1||num>3999)

            return re;

        unsigned int val[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};

        unsigned int length=sizeof(val)/sizeof(int);

        string r[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};

        for(int i=0;i<length;i++)

        {

            while(num>=val[i])

            {

                re+=r[i];

                num-=val[i];

            }

        }

        return re;

    }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: