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

问题:

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值