整数转换成罗马数字

给定一个整数num,( 1<=num<=3999),将整数转换成罗马数字。

如1,2,3,4,5对应的罗马数字分别位I,II,III,IV,V等。

格式:

   第一行输入一个整数,接下来输出对应的罗马数字。


输入:123


输出:CXXIII



我的解法(较差,有六十多行代码):

#include <stdio.h>

int main()
{
	int num=0; //[1,3999]
	int thousand=0;
	int hundred=0;
	int ten=0;
	int unit=0;
	char* String_thousand[3]={"M","MM","MMM"};
	char* String_hundred[9]={"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
	char* String_ten[9]={"X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
	char* String_unit[9]={"I","II","III","IV","V","VI","VII","VIII","IX"};
	char* String_Temp=NULL;
	scanf("%d",&num);
	
	thousand=num/1000;
	hundred=num/100-10*(num/1000);
	ten=num/10-10*(num/100);
	unit=num%1000%100%10;

//	printf("%d,%d,%d,%d\n",thousand,hundred,ten,unit);
	if(thousand!=0)
	{
		for(int i=0;i<3;i++)
		{
			if(thousand-1==i)
				String_Temp=String_thousand[i];
		}
	}
	if(String_Temp!=NULL)
		printf("%s",String_Temp);
	String_Temp=NULL;
	if(hundred!=0)
	{
		for(int i=0;i<9;i++)
		{
			if(hundred-1==i)
				String_Temp=String_hundred[i];
		}
	}
	if(String_Temp!=NULL)
		printf("%s",String_Temp);
	String_Temp=NULL;
	if(ten!=0)
	{
		for(int i=0;i<9;i++)
		{
			if(ten-1==i)
				String_Temp=String_ten[i];
		}
	}
	if(String_Temp!=NULL)
		printf("%s",String_Temp);
	String_Temp=NULL;
	if(unit!=0)
	{
		for(int i=0;i<9;i++)
		{
			if(unit-1==i)
				String_Temp=String_unit[i];
		}
	}
	if(String_Temp!=NULL)
		printf("%s\n",String_Temp);
	return 0;
}

  图一:



目前找到的最优解法(只有三十多行代码,比我的优化了一半):

#include <stdio.h>

void toRoman(int num)
{
    static char *roman[][10]={"","I","II","III","IV","V","VI","VII","VIII","IX",
                  "","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
                  "","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
                  "","M","MM","MMM"};
    int i, j, n;
    printf("%d = ", num);
    for(j = 0, i = 10000; j < 4; ++j, i/=10)
    {
        n = (num%i) / (i/10);
        printf("%s",roman[3-j][n]);
    }
    printf("\n");
}
 
int main()
{
    int n;
    printf("Please enter a decimal number (1-3999):");
    scanf("%d", &n);
    if(n < 1 || n > 3999)
    {
        printf("Illegal Parameter!\n");
        return 1;
    }
    toRoman(n);
     
    return 0;
}
图二:



经过分析,可以找到几点学习的地方:


1.我的程序中所构建的三个字符串数组,在最优解法中,直接构建成了一个二维数组。

2.我对于千,百,十,个位的数字获取太过复杂,最优解法只使用一个for循环即达到效果。

for(j = 0, i = 10000; j < 4; ++j, i/=10)
    {
        n = (num%i) / (i/10);
    }
3.我对于对应整数转换成罗马数字太过复杂,最优解法:

printf("%s",roman[3-j][n]);





  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值