给定一个整数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]);