[Swust OJ 666]--初来乍到(题号都这么溜~~,递归,找规律)
2015-06-16 22:36
387 查看
题目链接:http://acm.swust.edu.cn/problem/0666/
Time limit(ms): 1000 Memory limit(kb): 65535
Description
小李去埃及旅游,但是初来乍到的他不认识罗马数,所以请你将阿拉伯数n ( 0 < n <= 1000)改写为罗马数.
Input
N行数据,每行一个满足0 < n <= 1000的数;
结束以EOF判断
Output
每行一个,见输出示例
Sample Input
Sample Output
基本数字:
I:一 V:五 X:十 L:五十 C:一百 D:五百 M:一千
记数方法
(1)相同的数字连写,所表示的数等于这些数字相加得到的数,如: Ⅲ = 3;
(2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
(3)小的数字,(限于Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ = 4;Ⅸ = 9;
(4)在一个数的上面画一条横线,表示这个数增值 1 000 倍,如:Ⅻ = 12 000 。
编辑本段
组数规则
(1)基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
(2)不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
(3)V 和 X 左边的小数字只能用Ⅰ。
(4)L 和 C 左边的小数字只能用×。
(5)D 和 M 左 边的小数字只能用 C 。
Hint
解题思路:这里讲两种方法,像这类题纯粹找规律,做这道题时,我分析了多个数的组成方式。例如1=I,2=II,3=III,4=IV,5=V,6=VI,7=VII,8=VIII,9=IX,10=X······
其实后面的数都和1~9的形式一样,只需要分析每位的数值就行;下面是一些关键数值39=XXXIX,40=XL,49=XLIX,50=L,89=LXXXIX,90=XC······
因此想399,499,899这几种数就是分界点;最后只需从首位递归下去就可以了~~~
代码如下:
View Code
Time limit(ms): 1000 Memory limit(kb): 65535
Description
小李去埃及旅游,但是初来乍到的他不认识罗马数,所以请你将阿拉伯数n ( 0 < n <= 1000)改写为罗马数.
Input
N行数据,每行一个满足0 < n <= 1000的数;
结束以EOF判断
Output
每行一个,见输出示例
Sample Input
1 10 35 99 400 |
1=I 10=X 35=XXXV 99=XCIX 400=CD |
I:一 V:五 X:十 L:五十 C:一百 D:五百 M:一千
记数方法
(1)相同的数字连写,所表示的数等于这些数字相加得到的数,如: Ⅲ = 3;
(2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
(3)小的数字,(限于Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ = 4;Ⅸ = 9;
(4)在一个数的上面画一条横线,表示这个数增值 1 000 倍,如:Ⅻ = 12 000 。
编辑本段
组数规则
(1)基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
(2)不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
(3)V 和 X 左边的小数字只能用Ⅰ。
(4)L 和 C 左边的小数字只能用×。
(5)D 和 M 左 边的小数字只能用 C 。
Hint
解题思路:这里讲两种方法,像这类题纯粹找规律,做这道题时,我分析了多个数的组成方式。例如1=I,2=II,3=III,4=IV,5=V,6=VI,7=VII,8=VIII,9=IX,10=X······
其实后面的数都和1~9的形式一样,只需要分析每位的数值就行;下面是一些关键数值39=XXXIX,40=XL,49=XLIX,50=L,89=LXXXIX,90=XC······
因此想399,499,899这几种数就是分界点;最后只需从首位递归下去就可以了~~~
代码如下:
#include <stdio.h> void main(){ static char *a[][10] = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XCC", "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" }; int n, t, i, m; printf("Please enter number:"); scanf("%d", &n); printf("%d=", n); for (m = 0, i = 1000; m < 3; m++, i /= 10){ t = (n%i) / (i / 10); printf("%s", a[2 - m][t]); } printf("\n"); }
View Code
相关文章推荐
- [leetcode] Find Peak Element
- 临时对象如何产生
- 编程学习
- JSON.parse和eval的区别
- 变形课hd1181(DFS)
- 机器学习之信息
- BZOJ2530 : [Poi2011]Party
- 关于java日期类Date,DateFormat,SimpleDateFormat,Calendar总结
- Java类加载器简介
- 《你的灯还亮着吗》阅读笔记二
- android adb
- 黑马程序员----Java基础之面向对象(最终篇)
- 2.13带平滑线且带数据标签的散点图
- Django连接远程mysql数据库
- jboss端口说明
- c#之Async、Await剖析
- 一套Oracle SQL练习题及答案
- ubuntu常用命令
- Spark、Hadoop、Hive安装学习
- HTML paragraph