湘潭大学 湘大 XTU OJ 1217 A+B VII 题解(非常详细)

链接 

1217

题目

题目描述

小明非常高兴你能帮他处理那些罗马数字,他想学着自己写罗马数字,但是他不知道自己到底写对了没有。 请你帮他写个程序,能正确地将10进制数字转换成罗马数字,以便他能进行核对。 罗马数字是使用字母组合表示数字的。不同的字母表示的值如下表:

字母
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)

输入

每行输入一个整数n,1≤n≤10,000。

输出

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

样例输入

1
2
3
4
9999
10000

样例输出

I
II
III
IV
MMMMMMMMMCMXCIX
MMMMMMMMMMd

代码

#include

using namespace std;

int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		//1,5,10,50,100,500,1000
		//I,V, X, L, C,  D,  M
		//4,  9, 40,90,	400,	900
		//IV,IX, XL,XC,	CD,		CM
		if(n/1000>0)	
		{
			int q=n/1000;
			for(int i=0;i0)
		{
			int q=n/900;
			for(int i=0;i0)
		{
			int q=n/500;
			for(int i=0;i0)
		{
			int q=n/400;
			for(int i=0;i

总结

1.没有想到是一个考察耐心的题目,硬是写了116行

2.首先把每一种情况的罗马数字写出来,就像我在代码里面注释的那样

3.然后就是从大到小,分情况罗列,整除是向下取整,把我们输入的数字除以这些数字

//1,5,10,50,100,500,1000
//I,V, X, L, C,  D,  M
//4,  9, 40,90,	400,	900
//IV,IX, XL,XC,	CD,		CM

把这个数字保存下来,表示循环的次数,设置一个循环输出罗马数字,然后在循环外面把高位去掉(取模运算),把低位去掉是除法

湘潭大学 湘大 XTU OJ 1217 A+B VII 题解(非常详细)_第1张图片 

 

 

你可能感兴趣的:(算法竞赛,湘大,XTU,OJ,算法,贪心算法)