张老师数数——纽劢科技杯”第十六届同济大学程序设计竞赛暨上海邀请赛同步赛
链接:https://ac.nowcoder.com/acm/contest/637/A
来源:牛客网
题目描述
张老师需要用数字来统计学生们的得分情况,但阿拉伯数字已经不能满足他的要求了,所以想请你帮忙将学生的成绩转换成罗马数字。
罗马数字是由七个不同的符号来表示(I,V,X,L,C,D和M),其中每个符号对应的值如下表
符号 值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
罗马数字通常从左到右从最大写到最小,表示他们的总和。但是,数字4的罗马数字表示不是IIII,而是IV,表示5-1=4。同样的,有6个应用相同原理的规则:
I可以放在V(5)和X(10)之前代表4和9。
X可以在L(50)和C(100)之前代表40和90。
C可以放在D(500)和M(1000)之前代表400和900。
现在给定一个整数,张老师请你计算出其罗马数字的表示。
输入描述:
第一行一个整数x(1<=x<=2000)
输出描述:
输出一行,表示整数x所对应的罗马数字表示
示例1
输入
复制
5
输出
复制
V
示例2
输入
复制
1926
输出
复制
MCMXXVI
解题思路:
这道题是一个典型的字符串处理
下面看代码
#include <stdio.h>
#include <string.h>
char str[5],num[20];//str储存输入的数,num储存输出的数
int t=0;//用来将数据结果记入num;
void ffour(int x)//处理在数位为4上的数
{
int i;
for(i=1;i<=x;i++)//本题最高位最大值位2,所以可以直接用一个循环
num[t++]='M';
return ;
}
void fthree(int x)//处理在数位为3上的数
{
//我们需要考虑小于4,等于4,等于5,等于9,大于5且小于9;
//下面的几个函数原理同这个函数
int i;
if(x<=3)
{
for(i=1;i<=x;i++)
num[t++]='C';
}
else if(x==4)
{
num[t++]='C';
num[t++]='D';
}
else if(x==5)
num[t++]='D';
if(x>5&&x<9)
{
num[t++]='D';
for(i=6;i<=x;i++)
num[t++]='C';
}
if(x==9)
{
num[t++]='C';
num[t++]='M';
}
return ;
}
void ftwo(int x)//处理在数位为2上的数
{
int i;
if(x<=3)
{
for(i=1;i<=x;i++)
num[t++]='X';
}
else if(x==4)
{
num[t++]='X';
num[t++]='L';
}
else if(x==5)
num[t++]='L';
if(x>5&&x<9)
{
num[t++]='L';
for(i=6;i<=x;i++)
num[t++]='X';
}
if(x==9)
{
num[t++]='X';
num[t++]='C';
}
return ;
}
void fone(int x)//处理在数位为1上的数
{
int i;
if(x<=3)
{
for(i=1;i<=x;i++)
num[t++]='I';
}
else if(x==4)
{
num[t++]='I';
num[t++]='V';
}
else if(x==5)
num[t++]='V';
if(x>5&&x<9)
{
num[t++]='V';
for(i=6;i<=x;i++)
num[t++]='I';
}
if(x==9)
{
num[t++]='I';
num[t++]='X';
}
return ;
}
void a(int m,int x)
{
if(m==4)
ffour(x);
else if(m==3)
fthree(x);
else if(m==2)
ftwo(x);
else if(m==1)
fone(x);
return ;
}
int main()
{
int x,n;
int i;
scanf("%s",str);//用串来储存输入的数
n=strlen(str);
for(i=n-1;i>=0;i--)
{
x=str[n-1-i]-'0';
a(i+1,x);//传递数位和要处理的数(这个数是在这个数位上的数)
}
num[t]='\0';//最后结尾
printf("%s\n",num);
return 0;
}