开始我以为不能用strcat这个函数,还另外写了这个函数。
C版本,我感觉C语言写涉及到字符串的东西就很麻烦。
int getLength(int num)
{
int i = 0;
while(num)
{
i++;
num = num /10;
}
return i;
}
char *getChar1(int num, char *a) {
char *singleRoman = (char*)(malloc(sizeof(char)*num*3));
int len = strlen(a);
for(int i = 0; i<3*num; i++)
{
singleRoman[i] = 0;
}
for(int i = 0; i < num*len ; i++)
{
singleRoman[i] = a[i%len];
}
return singleRoman;
}
char *getChar2(int num, char a) {
char *singleRoman = (char*)(malloc(sizeof(char)*num*3));
for(int i = 0; i<3*num; i++)
{
singleRoman[i] = 0;
}
for(int i = 0; i < num; i++)
{
singleRoman[i] = a;
}
return singleRoman;
}
char *strCatch(char *c1, char *c2) {
int len = strlen(c1)+strlen(c2);
char *c3 = (char*)(malloc(sizeof(char)*len));
for(int i = 0; i<strlen(c1);i++)
{
c3[i] = c1[i];
}
for(int j = 0;j<strlen(c2);j++)
{
c3[strlen(c1)+j]=c2[j];
}
return c3;
}
char* intToRoman(int num) {
int len = getLength(num);
int k = 0;
// char *temp;
char *ans = (char*)(malloc(sizeof(char)*3*len));
char *ans1 = (char*)(malloc(sizeof(char)*3*len));
// char *ans1;
for(int i = 0; i<3*len;i++)
{
ans[i]=0;
ans1[i]=0;
}
ans = getChar2(num/1000,'M');
num = num%1000;
ans = strCatch(ans,getChar1(num/900, "CM"));
num = num%900;
// printf("%s\n",temp);
ans = strCatch(ans,getChar2(num/500,'D'));
num = num%500;
ans = strCatch(ans,getChar1(num/400,"CD"));
num = num%400;
ans = strCatch(ans,getChar2(num/100,'C'));
num = num%100;
ans = strCatch(ans,getChar1(num/90,"XC"));
num = num%90;
ans = strCatch(ans,getChar2(num/50,'L'));
num = num%50;
ans = strCatch(ans,getChar1(num/40,"XL"));
num = num%40;
ans = strCatch(ans,getChar2(num/10,'X'));
num = num%10;
ans = strCatch(ans,getChar1(num/9,"IX"));
num = num%9;
ans = strCatch(ans,getChar2(num/5,'V'));
num = num%5;
ans = strCatch(ans,getChar1(num/4,"IV"));
num = num%4;
ans = strCatch(ans,getChar2(num/1,'I'));
for(int j = 0; j<strlen(ans);j++)
{
if(ans[j] == 'M' ||ans[j] == 'C'||ans[j] == 'D'||ans[j] == 'X'||ans[j] == 'V'||ans[j] == 'I'||ans[j] == 'L')
{
ans1[k++] = ans[j];
}
}
ans1[k] = 0;
return ans1;
}
再看看别人写的比较好懂的,真的是留下了没技术的泪水。
char* intToRoman(int num) {
int base[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
char *str[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX",
"V", "IV", "I" };
char *roman = (char*)malloc(sizeof(char) * 20);
roman[0] = '\0';
int i = 0;
while (num != 0)
{
if (num >= base[i])
{
num -= base[i];
strcat(roman, str[i]);
}
else
i++;
}
return roman;
}
C++版本和这个C版本差不多。
class Solution {
public:
string intToRoman(int num) {
string res = "";
vector<int> val{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
vector<string> str{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
for (int i = 0; i < val.size(); ++i) {
while (num >= val[i]) {
num -= val[i];
res += str[i];
}
}
return res;
}
};