张老师数数

张老师数数——纽劢科技杯”第十六届同济大学程序设计竞赛暨上海邀请赛同步赛

链接: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值