[leetcode]12. Integer to Roman

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值