Leetcode-12整数转罗马数字

开始我以为不能用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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值