概述
题目链接:
http://acm.xidian.edu.cn/problem.php?id=1256
1256: Roman Numbers
时间限制: 1 Sec 内存限制: 128 MB提交: 18 解决: 12
[ 提交][ 状态][ 讨论版]
题目描述
把小于 4000 的正整数转换成相应的罗马数字。
罗马数字共有7个,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000)。按照下述的规则可以表示任意小于4000的正整数。
重复数次:一个罗马数字重复几次,就表示这个数的几倍。
右加左减:
在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
但是,左减时不可跨越一个位值。比如,99不可以用IC()表示,而是用XCIX()表示。(等同于阿拉伯数字每位数字分别表示。)
左减数字必须为一位,比如8写成VIII,而非IIX。
右加数字不可连续超过三位,比如14写成XIV,而非XIIII。(见下方“数码限制”一项。)
数码限制:
同一数码最多只能连续出现三次,如40不可表示为XXXX,而要表示为XL。
输入
多组数据,每组数据一行,一个小于4000的正整数。
输出
对于每组数据,输出一行,相应的罗马数字。
样例输入
3
6
14
199
1437
样例输出
III
VI
XIV
CXCIX
MCDXXXVII
思路:当时做这道题时看到一大堆的规则直接蒙圈。最后看了一下答案,打表来做
(其实我还是不太明白那些规则~)
上代码:
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char gewei[9][5]={"I","II","III","IV","V","VI","VII","VIII","IX"};
char shiwei[9][5]={"X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
char baiwei[9][5]={"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
char qianwei[3][5]={"M","MM","MMM"};
int qian,bai,shi,ge,a;
while(scanf("%d",&a) != EOF)
{
qian=a/1000;
bai=(a%1000)/100;
shi=(a%100)/10;
ge=a%10;
if(qian>=1&&qian<=9)
printf("%s",qianwei[qian-1]);
if(bai>=1&&bai<=9)
printf("%s",baiwei[bai-1]);
if(shi>=1&&shi<=9)
printf("%s",shiwei[shi-1]);
if(ge>=1&&ge<=9)
printf("%s",gewei[ge-1]);
printf("n");
}
return 0;
}
最后
以上就是聪慧翅膀为你收集整理的xdoj1256(2017新生赛现场赛E题)的全部内容,希望文章能够帮你解决xdoj1256(2017新生赛现场赛E题)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复