题目链接
https://leetcode.com/problems/integer-to-roman/
注意点
罗马字符转化规律中存在特例
解法
解法1:与1000/900/500/.../4/1依次比较,若大于某个阈值则输出对应罗马字符。O(n)
char * intToRoman(int num){
//3888为"MMMDCCCLXXXVIII",最多需要15个字符,但经过测试25个时无输出bug
char string[25];
char *str = string;
char *s = string;
while(num)
{
if(num>=1000)
{
*s++ = 'M';
num -= 1000;
}
else if(num>=900)
{
*s++ = 'C';
*s++ = 'M';
num -= 900;
}
else if(num>=500)
{
*s++ = 'D';
num -= 500;
}
else if(num>=400)
{
*s++ = 'C';
*s++ = 'D';
num -= 400;
}
else if(num>=100)
{
*s++ = 'C';
num -= 100;
}
else if(num>=90)
{
*s++ = 'X';
*s++ = 'C';
num -= 90;
}
else if(num>=50)
{
*s++ = 'L';
num -= 50;
}
else if(num>=40)
{
*s++ = 'X';
*s++ = 'L';
num -= 40;
}
else if(num>=10)
{
*s++ = 'X';
num -= 10;
}
else if(num>=9)
{
*s++ = 'I';
*s++ = 'X';
num -= 9;
}
else if(num>=5)
{
*s++ = 'V';
num -= 5;
}
else if(num>=4)
{
*s++ = 'I';
*s++ = 'V';
num -= 4;
}
else if(num>=1)
{
*s++ = 'I';
num -= 1;
}
}
*s = ' ';
return str;
}
测试代码
#include <stdio.h>
int main()
{
int num;
while(scanf("%d",&num)!= EOF)
{
printf("%s
",intToRoman(num));
}
return 0;
}
遇到问题
1.为什么需要开长度为25的字符数组存储字符串,实测小于25时存在输出bug。(再经测试后...leetcode自带编译器中长度开25是可行的,dev c++中长度开到25也会有bug。保险起见开到肯定够用的100长度就不会出错了。)
小结
理解罗马数字与整数的换算机制即可