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.

罗马数字记数方法:

基本字符 I V X L C D M
相应的阿拉伯数字表示为 1 5 10 50 100 500 1000
相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
小的数字、(限于 Ⅰ、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
正常使用时、连写的数字重复不得超过三次;
在一个数的上面画一条横线、表示这个数扩大 1000 倍。

组数规则

基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放在大数的左边只能用一个;
不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;

分析

将一个整数转化为罗马数字。因此可以通过数位上的数字挨个解析,之后组成为答案。
也可以依次减去{1000,900,500,400,100,90,50,40,10,9,5,4,1},组成最后的答案。

char* intToRoman(int num) {
    char* c[4][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"}
        };
        char * ans=(char *)malloc(sizeof(char)*50);
        int length=0,i=0;
        int temp=num/1000%10;
        while(c[3][temp][i]!='\0')
        {
            ans[length]=c[3][temp][i];
            length++;
            i++;
        }
        i=0;
        temp=num/100%10;
        while(c[2][temp][i]!='\0')
        {
            ans[length]=c[2][temp][i];
            length++;
            i++;
        }
        i=0;
        temp=num/10%10;
        while(c[1][temp][i]!='\0')
        {
            ans[length]=c[1][temp][i];
            length++;
            i++;
        }
        i=0;
        temp=num%10;
        while(c[0][temp][i]!='\0')
        {
            ans[length]=c[0][temp][i];
            length++;
            i++;
        }
        ans[length]='\0';
        return ans;
}

你可能感兴趣的:(Leetcode 12. Integer to Roman)