[leetcode]12. Integer to Roman

来源:互联网 发布:js对象循环引用 编辑:程序博客网 时间:2024/05/17 07:27

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




0 0
原创粉丝点击