题意:罗马数字的表示方法: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;
}