首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

3.罗马数字转整数

【题号13】题目描述:

给定一个罗马数字,将其转换成整数。

返回的结果要求在 1 到 3999 的范围内。

前置知识:

罗马数字的基本字符有7个:I,V,X,L,C,D,M,分别表示1,5,10,50,100,500,1000;

在构成数字的时候,有下列规则:

1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;

2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;

3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;

4、正常使用时,连写的数字重复不得超过三次。

解题思路:

如果字符串只有一位,直接输出对应数字;

如果字符串大于一位,需要运用以上4条规则:

从左开始遍历字符串,比较当前字符和下一个字符对应的数值大小(数值分别记为a,b);

如果a≥b,则按照规则1和2,直接累加;

否则,按照规则3,加上b-a,同时i再向右前进一位;

注意:for循环只遍历到数组倒数第二位,最后一位数若未在规则3中被处理掉,则应单独加上。

代码实现:

int arr[90]={},result=0;

// 下面将直接用罗马数字对应的大写字母作数组下标,大写字母的ASCII码对应65~90,故取90,避免溢出

arr['I']=1;

arr['V']=5;

arr['X']=10;

arr['L']=50;

arr['C']=100;

arr['D']=500;

arr['M']=1000;

if(s.length()>1){

for(int i=0;i

if(arr[s[i]]>=arr[s[i+1]]){//对应规则1和2

result+=arr[s[i]];

}

else{

result+=arr[s[i+1]]-arr[s[i]];// 对应规则3

i++;

}

if(i==s.length()-2)

result+=arr[s[i+1]];// 对最后一个字符进行处理

}

}else{

result=arr[s[0]];// 只有一个字符的情况

}

return result;

}

}

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180331G1DK3700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券