Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
->Roman数字计算规则:
基本字符有7个:I,V,X,L,C,D,M,分别表示1,5,10,50,100,500,1000。
在构成数字的时候,有下列规则:
1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
4、正常使用时,连写的数字重复不得超过三次。
->思路1:1000的数字单独考虑{1000,2000,3000}对应{M,MM,MMM};100对应{C,CC,CCC,CD,D,DC,DCC,DCCC,CM},10对应{X,XX,XXX,XL,L,LX,LXX,LXXX,XC},所以对于个位,十位和百位,可以分以下几种情况进行考虑:{0,1,2,3} {4} {5,6,7,8} {9}
代码如下:
char* intToRoman(int num) {
char Roman[7]={'I','V','X','L','C','D','M'};
char* result = (char*)malloc(15*sizeof(char));
int flag=1000;
int tmp=num/flag; //1000
if( tmp != 0)
{
for(int i=0; i<tmp ;i++)
result[i]=Roman[6];
}
int length=tmp;
int index = 6;
while(num>0)
{
num = num - flag*tmp;
flag = flag/10;
if(flag==0)
flag=1;
tmp = num/flag;
index = index-2;
if(tmp < 4)
{
for(int i=0; i<tmp ;i++)
result[length+i]=Roman[index];
length = length+tmp;
}
if(tmp ==4)
{
result[length+0]=Roman[index];
result[length+1]=Roman[index+1];
length = length+2;
}
if((tmp>4)&&(tmp<9))
{
result[length+0]=Roman[index+1];
for(int i=1; i<tmp-4; i++)
{
result[length+i]=Roman[index];
}
length = length+tmp-4;
}
if(tmp==9)
{
result[length+0]=Roman[index];
result[length+1]=Roman[index+2];
length = length+2;
}
}
for(int i=length; i<15; i++)
{
result[i]=NULL;
}
return result;
}
->思路2:以上的代码执行后只超过了10%的用户,查看别人的代码,有一个比较好的思路,分别列出来1,4,9的罗马数字表示,找到比输入字符小的最大的罗马数字,将输入字符减该罗马数字,直至为0