HDU—— 2352 Verdis Quo

题意:罗马数字的表示方法:I = 1,V = 5,X = 10,L = 50,C = 100,D = 500,M = 1000,这些字母如果按所代表值的大小以非递增形式排列的则所表示的数字为将这些字母代表的值依次相加,如果说某个罗马字母的左边出现一个比当前字母代表值还小的字母,则左边的字母为负值,所以罗马字母可通过加减形式表示数字,其中的表示形式有如下规则:

1)I、X和C最多能同时出现3次

2)V、L、D不能被连续使用,M最多能被连续使用2次

3)一个罗马字母左侧只能出现一个比它所代表值小的字母,不能出现连续的多个比它小的字母

4)只有I、X、C能做减数

5)I只能用在V或X的左侧,X只能用在L或C的左侧,C只能用在D或M的左侧

现写一个程序将所给的罗马字母转换为十进制数字并输出。

解题思路:

Code:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
using namespace std;

map<char,int> vis;
int N;
int main()
{//首先用map将字母与数字值一一对应
    vis['I'] = 1,vis['V'] = 5,vis['X'] = 10;
    vis['L'] = 50,vis['C'] = 100,vis['D'] = 500;
    vis['M'] = 1000;
    scanf("%d",&N);
    getchar();
    for(int i = 0; i < N; i++)
    {
       char str[20];
       gets(str);
       int len = strlen(str);//每次接受一个字符串后计算字符串的长度
       int num = vis[str[len-1]];//定义一个int型变量接收转换后的值,然后先将字符串的最后一位对应的值赋给num
       for(int j = len-2; j>=0; j--)//从后往前遍历字符串
       {
           if(vis[str[j]] >= vis[str[j+1]]) num +=vis[str[j]];//如果说j的值大于j+1的值,则num +=vis[str[j]]
           else num -=vis[str[j]];//否则num -=vis[str[j]]
       }
       printf("%d\n",num);//最后输出num值即可
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值