leecode-C语言实现-12. 整数转罗马数字

一、题目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二、解题思路
例如:1994转换成罗马数字。
我们可以把1994拆分成:1,9,9,4。拆分的方法就是1994余除10得到的余数就是拆分后的值。

1994 % 10 = 199 。。。4
199 % 10 = 19 。。。9
19 % 10 = 1 。。。9
1 % 10 = 0 。。。1

再把这四个数字存储到一个数组中,这是由于strcat函数是在字符串后面进行追加,而不能在字符串前面追加,如我们第一个得到的是4的罗马数字IV,第二个得到是90的罗马数字XC,不用数组将顺序变成正序的话,就会变成IVXC,是一个错误答案。得到数组后,我们只需要实现千位转罗马,百位转罗马,十位转罗马,个位转罗马的函数。

这个数字有几位我们可以通过上面的1994拆分时就能得出结果,每一位我们需要写单独判断,因为罗马数字每一位对应的字母都不同,但大致逻辑是一样的,我们只要写出例如个位,其它位的逻辑,只要复制粘贴,再修改相应的罗马数字即可。
逻辑上我们先把几个特殊的情况先判断出来,例如:4,对于的罗马数字是IV,而不是IIII,还有5和9,之后在判断这个数大于5还是小于5,小于5的话,4的话前面已经判断了可以剔除,只需容纳1,2,3即可,对应的I,II,III。再说大于5,我们只需判断6,7,8,也就是在V后面补I。其他的位我们可以以此类推得到结果,再拼接到一起即可。

三、虚机测试代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
    char* TempNum2Roman(int num, int numsize, int char_arr_size);
    char * intToRoman(int num);
    char * intToRoman_v1(int num);
    int i;
    int char_arr_size = 20;
    char* res = malloc(sizeof(char) * char_arr_size);
    for(i=0; i<10; i++)
    {
        strcpy(res,TempNum2Roman( i, 1, char_arr_size));
        printf("i : %4d, res : %s\n",i,res);
    } 
    for(i=1; i<10; i++)
    {
        strcpy(res,TempNum2Roman( i, 2, char_arr_size));
        printf("i : %4d, res : %s\n",i*10,res);
    }
    for(i=1; i<10; i++)
    {   
        strcpy(res,TempNum2Roman( i, 3, char_arr_size));
        printf("i : %4d, res : %s\n",i*100,res);
    }
    for(i=1; i<4; i++)
    {
        strcpy(res,TempNum2Roman( i, 4, char_arr_size));
        printf("i : %4d, res : %s\n",i*1000,res);
    }

    int TestArr[] = {3,58,1994,0};
    i = 0;
    while(TestArr[i] != 0)
    {
        printf("TestArr[i] : %4d, intToRoman_v0 : %s\n",TestArr[i],intToRoman(TestArr[i]));
        printf("TestArr[i] : %4d, intToRoman_v1 : %s\n",TestArr[i],intToRoman_v1(TestArr[i]));
        printf("+++++++++++++++++++++++++++\n");
        i++;
    }
}

char * intToRoman_v1(int num)
{
    char arr[][10][5] = {{"", "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 char_arr_size = 16;
    int int_arr_size = 4;
    char* res = malloc(sizeof(char) * char_arr_size);
    int* TmpArr = malloc(sizeof(int) * int_arr_size);
    int i,y;
    int x = num;
    int cnt = 0;
    for(i=0; i<int_arr_size; i++)
    {
        TmpArr[i] = -1;
    }
    strcpy(res,"");
    while(x / 10 != 0)
    {
        y = x % 10;
        TmpArr[cnt] = y;
        x = x / 10;
        cnt++;
    }
    TmpArr[cnt] = x;
    cnt++;
    for(i=int_arr_size-1; i>=0; i--)
    {
        if(TmpArr[i] != -1)
        {
            strcat(res,arr[i][TmpArr[i]]);
        }
    }
    return res; 
}

char * intToRoman(int num)
{
    void PrintfArr(void *arr, int size ,int elementsize);
    char* TempNum2Roman(int num, int numsize, int char_arr_size);
    int char_arr_size = 16;
    int int_arr_size = 4;
    int cnt = 0;
    int x = num;
    int y;
    char* res = malloc(sizeof(char) * char_arr_size);
    strcpy(res,"");
    int* TmpArr = malloc(sizeof(int) * int_arr_size);
    int i;
    for(i=0; i<int_arr_size; i++)
    {
        TmpArr[i] = -1;
    }
    while(x / 10 != 0)
    {
        y = x % 10;
        TmpArr[cnt] = y;
        x = x / 10;
        cnt++;
    }
    TmpArr[cnt] = x;
    cnt++;
    //PrintfArr(TmpArr, cnt ,sizeof(int));
    for(i=int_arr_size-1; i>=0; i--)
    {
        if(TmpArr[i] != -1)
        {
            strcat(res,TempNum2Roman(TmpArr[i], i+1, 5));
        }
    }
    return res;
}

char* TempNum2Roman(int num, int numsize, int char_arr_size)
{
    //printf("num : %d, numsize : %d, char_arr_size : %d\n",num,numsize,char_arr_size);
    char* res = malloc(sizeof(char) * char_arr_size);
    strcpy(res,"");
    int i;
    if(num == 0)
    {
        return res;
    }
    else if(numsize == 1)
    {
        if(num == 4)
        {
            return strcpy(res,"IV");
        }
        else if(num == 5)
        {
            return strcpy(res,"V");
        }
        else if(num == 9)
        {
            return strcpy(res,"IX");
        }
        else if(num < 5)
        {
            for(i=0; i<num; i++)
            {
                strcat(res,"I");
            }
            return res;
        }
        else if(num > 5)
        {
            strcpy(res,"V");
            for(i=0; i<num - 5; i++)
            {
                strcat(res,"I");
            }
            return res;
        }
    }
    else if(numsize == 2)
    {
        if(num == 4)
        {   
            return strcpy(res,"XL");
        }
        else if(num == 5)
        {   
            return strcpy(res,"L");
        }
        else if(num == 9)
        {
            return strcpy(res,"XC");
        }
        else if(num < 5)
        {
            for(i=0; i<num; i++)
            {
                strcat(res,"X");
            }
            return res;
        }
        else if(num > 5)
        {
            strcpy(res,"L");
            for(i=0; i<num - 5; i++)
            {
                strcat(res,"X");
            }
            return res;
        }
    }
    else if(numsize == 3)
    {
        if(num == 4)
        {
            return strcpy(res,"CD");
        }
        else if(num == 5)
        {
            return strcpy(res,"D");
        }
        else if(num == 9)
        {
            return strcpy(res,"CM");
        }
        else if(num < 5)
        {
            for(i=0; i<num; i++)
            {
                strcat(res,"C");
            }
            return res;
        }
        else if(num > 5)
        {
            strcpy(res,"D");
            for(i=0; i<num - 5; i++)
            {
                strcat(res,"C");
            }
            return res;
        }
    }
    else if(numsize == 4)
    {
        for(i=0; i<num; i++)
        {
            strcat(res,"M");
        }
        return res;
    }
    return res;
}

void PrintfArr(void *arr, int size ,int elementsize)
{
    if(elementsize == sizeof(int))
    {
        int *tmparr = (int*)arr;
        int i;
        for(i=0; i<size; i++)
        {
            printf("%d ",tmparr[i]);
        }
    }
    else if(elementsize == sizeof(char))
    {
        char *tmparr = (char*)arr;
        int i;
        for(i=0; i<size; i++)
        {
            printf("%c ",tmparr[i]);
        }
    }
    printf("\n========================\n");
}

四、虚机测试截图
在这里插入图片描述

五、leecode提交代码
(1)

char * intToRoman(int num)
{
    char* TempNum2Roman(int num, int numsize, int char_arr_size);
    int char_arr_size = 16;
    int int_arr_size = 4;
    int cnt = 0;
    int x = num;
    int y;
    char* res = malloc(sizeof(char) * char_arr_size);
    strcpy(res,"");
    int* TmpArr = malloc(sizeof(int) * int_arr_size);
    int i;
    for(i=0; i<int_arr_size; i++)
    {
        TmpArr[i] = -1;
    }
    while(x / 10 != 0)
    {
        y = x % 10;
        TmpArr[cnt] = y;
        x = x / 10;
        cnt++;
    }
    TmpArr[cnt] = x;
    cnt++;
    for(i=int_arr_size-1; i>=0; i--)
    {
        if(TmpArr[i] != -1)
        {
            strcat(res,TempNum2Roman(TmpArr[i], i+1, 5));
        }
    }
    return res;
}
char* TempNum2Roman(int num, int numsize, int char_arr_size)
{
    char* res = malloc(sizeof(char) * char_arr_size);
    strcpy(res,"");
    int i;
    if(num == 0)
    {
        return res;
    }
    else if(numsize == 1)
    {
        if(num == 4)
        {
            return strcpy(res,"IV");
        }
        else if(num == 5)
        {
            return strcpy(res,"V");
        }
        else if(num == 9)
        {
            return strcpy(res,"IX");
        }
        else if(num < 5)
        {
            for(i=0; i<num; i++)
            {
                strcat(res,"I");
            }
            return res;
        }
        else if(num > 5)
        {
            strcpy(res,"V");
            for(i=0; i<num - 5; i++)
            {
                strcat(res,"I");
            }
            return res;
        }
    }
    else if(numsize == 2)
    {
        if(num == 4)
        {   
            return strcpy(res,"XL");
        }
        else if(num == 5)
        {   
            return strcpy(res,"L");
        }
        else if(num == 9)
        {
            return strcpy(res,"XC");
        }
        else if(num < 5)
        {
            for(i=0; i<num; i++)
            {
                strcat(res,"X");
            }
            return res;
        }
        else if(num > 5)
        {
            strcpy(res,"L");
            for(i=0; i<num - 5; i++)
            {
                strcat(res,"X");
            }
            return res;
        }
    }
    else if(numsize == 3)
    {
        if(num == 4)
        {
            return strcpy(res,"CD");
        }
        else if(num == 5)
        {
            return strcpy(res,"D");
        }
        else if(num == 9)
        {
            return strcpy(res,"CM");
        }
        else if(num < 5)
        {
            for(i=0; i<num; i++)
            {
                strcat(res,"C");
            }
            return res;
        }
        else if(num > 5)
        {
            strcpy(res,"D");
            for(i=0; i<num - 5; i++)
            {
                strcat(res,"C");
            }
            return res;
        }
    }
    else if(numsize == 4)
    {
        for(i=0; i<num; i++)
        {
            strcat(res,"M");
        }
        return res;
    }
    return res;
}

(2)

char * intToRoman(int num)
{
    char arr[][10][5] = {{"", "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 char_arr_size = 16;
    int int_arr_size = 4;
    char* res = malloc(sizeof(char) * char_arr_size);
    int* TmpArr = malloc(sizeof(int) * int_arr_size);
    int i,y;
    int x = num;
    int cnt = 0;
    for(i=0; i<int_arr_size; i++)
    {
        TmpArr[i] = -1;
    }
    strcpy(res,"");
    while(x / 10 != 0)
    {
        y = x % 10;
        TmpArr[cnt] = y;
        x = x / 10;
        cnt++;
    }
    TmpArr[cnt] = x;
    cnt++;
    for(i=int_arr_size-1; i>=0; i--)
    {
        if(TmpArr[i] != -1)
        {
            strcat(res,arr[i][TmpArr[i]]);
        }
    }
    return res; 
}

六、leecode代码提交截图
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值