一、题目
二、解题思路
例如: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代码提交截图