Integer to Roman

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

目前做过的最简单的一道medium的题目,没有数学,没有算法,百度下搞懂罗马数字是怎么回事就行。

不过做完后通过看别人的解题,倒是发现“指针数组”这个不错的数据结构,大大的缩短了代码的长度,大家可以看看下面的对比。程序思想都是一样的。

char* intToRoman(int num) {
	char *s = (char *)malloc(sizeof(char) * 20);
	strcpy(s , "");
	int digit,base;
	for(base = 1000; base > 0 ; num %= base, base /= 10)
	{
		digit = num / base;
		switch(digit)
		{
			case 0:		break;
			case 1:		switch(base){
							case 1000:	strcat(s, "M");		break;
							case 100:	strcat(s, "C");		break;
							case 10:	strcat(s, "X");		break;
							case 1:		strcat(s, "I");		break;
						}
						break;
			case 2:		switch(base){
							case 1000: strcat(s, "MM");			break;
							case 100:  strcat(s, "CC"); 		break;
							case 10:   strcat(s, "XX"); 		break;
							case 1:	   strcat(s, "II"); 		break;
						}
						break;
			case 3:		switch(base){
							case 1000:	strcat(s, "MMM");		break;
							case 100:	strcat(s, "CCC");		break;
							case 10:	strcat(s, "XXX");		break;
							case 1:		strcat(s, "III");		break;
						}
						break;
			case 4:		switch(base){
							case 100:	strcat(s, "CD");		break;
							case 10:	strcat(s, "XL");		break;
							case 1:		strcat(s, "IV");		break;
						}
						break;
			case 5:		switch(base){
							case 100:	strcat(s, "D");		break;
							case 10:	strcat(s, "L");		break;
							case 1:		strcat(s, "V");		break;
						}
						break;
			case 6:		switch(base){
							case 100:	strcat(s, "DC");		break;
							case 10:	strcat(s, "LX");		break;
							case 1:		strcat(s, "VI");		break;
						}
						break;
			case 7:		switch(base){
							case 100:	strcat(s, "DCC");		break;
							case 10:	strcat(s, "LXX");		break;
							case 1:		strcat(s, "VII");		break;
						}
						break;
			case 8:		switch(base){
							case 100:	strcat(s, "DCCC");		break;
							case 10:	strcat(s, "LXXX");		break;
							case 1:		strcat(s, "VIII");		break;
						}
						break;
			case 9:		switch(base){
							case 100:	strcat(s, "CM");		break;
							case 10:	strcat(s, "XC");		break;
							case 1:		strcat(s, "IX");		break;
						}
						break;
		}
	}	
	return s;
}

char* intToRoman(int num) {
	char *chM[] = {"","M","MM","MMM"};
	char *chC[] = {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
	char *chX[] = {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
	char *chI[] = {"","I","II","III","IV","V","VI","VII","VIII","IX"};

	char *s = (char *)malloc(sizeof(char) * 20);
	strcpy(s , "");
	int digit,base;
	for(base = 1000; base > 0 ; num %= base, base /= 10)
	{
		digit = num / base;
		switch(base)
		{
			case 1000:		strcat(s, chM[digit]);	break;
			case 100:		strcat(s, chC[digit]);	break;
			case 10:		strcat(s, chX[digit]);  break;
			case 1:			strcat(s, chI[digit]);  break;
		}
	}
	return s;
}


不过有一点还是不太明白,AC后显示程序的运行时为20ms,不是最快的。但我也想不出来还有什么更快的方法,个人觉得这种方法已经够直观和高效了。哪位读者要是有想法的话,欢迎交流~

小结:

1)操作字符串时,记得用strcat等函数,以及合理运用指针数组,可以使代码更简洁高效。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值