XTU,C语言,a+b VI

题目描述

小明非常喜欢做a+b的算术题,为此他搜集了很多的练习题。 今天他拿到一个很古老的练习册,上面是使用罗马数字表示的。 小明不太擅长处理罗马数字,请你帮帮他,告诉他罗马数字对应的十进制数的值。 罗马数字是使用字母组合表示数字的,不同的字母表示的值如下表:

字母
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

表示规则如下:

  • 数字的值是为所有字母的值的和。比如说II=2,XIII=13
  • 没有0,比如207使用两个100,1个5,2个1表示,即CCVII
  • 字母应该按值的降序从左到右排列,但为了避免太多的重复(比如IIII),使用减法来缩短式子
    1. 使用I在V和X前,表示4(IV)和9(IX)
    2. 使用X在L和C前,表示40(XL)和90(XC)
    3. 使用C在D和M前,表示400(CD)和900(CM)

输入

每行输入一个罗马数字,字符串长度不超过25。测试数据保证是合法的罗马数字。

输出

每行输出对应罗马数字的十进制整数。

样例输入

MM
CM
MCD
MDX
XCIX

样例输出

2000
900
1400
1510
99

这道题只要知道了方法就很容易解出。

为了简便,可以先将每个字符转换为其所代表的数。

接下来,我们从最右边向左边依次进行运算:

设a,b,c为字符所代表的数,和为sum,然后进行判断,如果b大于c,则sum =c + b,如果b小于c,

sum = c - b。每次比较相邻的两个数,通过循环求出sum的最终结果即为所求的值。

#include <stdio.h>
#include <string.h>
char str[26];
int num[26];
void shift(int i)
{
    if(str[i]=='I')
	num[i] = 1;
	if(str[i]=='V')
	num[i] = 5;
	if(str[i]=='X')
	num[i] = 10;
	if(str[i]=='L')
	num[i] = 50;
	if(str[i]=='C')
    num[i] = 100;
    if(str[i]=='D')
    num[i] = 500;
    if(str[i]=='M')
    num[i] = 1000;
}
int main()
{
    int i,len,sum;
    while(scanf("%s",str)!=EOF)
	{
	    len = strlen(str);
	    for(i = 0;i < len;i++)
	    shift(i);//将字符转换为其所代表的数
	    sum = num[len-1];
	    for(i = len-2;i >= 0;i--)
	    {
	        if(num[i] >= num[i+1])
	        sum += num[i];
	        else
	        sum -= num[i];
	    }
	    printf("%d\n",sum);
	}
}

上一篇:环境(5)Linux文件系统


下一篇:Linux 系统中的vi和vim指令