罗马数字转整数(c语言解法)LeetCode13

目录

题目来源:

问题介绍

特殊情况

函数要求

函数实现

用法示例

结果展示

 比较难想到的解法

题目来源:

13. 罗马数字转整数 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/roman-to-integer/

问题介绍

罗马数字包含以下七种字符: MDLXC, V ,I

例如:

罗马数字 2 写做 II ,即为两个并列的 I 。

12 写做 XII ,即为 X + II 。

27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。

特殊情况

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

函数要求


给定一个罗马数字,将其转换成整数。

输入: s = "II"
输出: 2
输入: s = "IV"
输出: 4
输入: s = "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
输入: s = "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

函数实现

int romanToInt(char* s)
{
	int sum = 0;
	while (*s)  
	{
		if (*s == 'V')      sum += 5;
		else if (*s == 'L') sum += 50;
		else if (*s == 'D') sum += 500;
		else if (*s == 'M') sum += 1000;//V,L,D,M,I是普通罗马数字,直接加到sum中
		else if (*s == 'I') //I,X,C特殊要视情况而定
		{
			if (*(s + 1) == 'V' || *(s + 1) == 'X') sum -= 1;
			else sum += 1;
		}
		else if (*s == 'X') 
		{
			if (*(s + 1) == 'L' || *(s + 1) == 'C') sum -= 10;
			else sum += 10;
		}
		else if (*s == 'C') 
		{
			if (*(s + 1) == 'D' || *(s + 1) == 'M') sum -= 100;
			else sum += 100;
		}
		s++;  //历遍s
	}
	return sum;
}

用法示例

#include<stdio.h>
int romanToInt(char* s)
{
	int sum = 0;
	while (*s)  
	{
		if (*s == 'V')      sum += 5;
		else if (*s == 'L') sum += 50;
		else if (*s == 'D') sum += 500;
		else if (*s == 'M') sum += 1000;
		else if (*s == 'I') 
		{
			if (*(s + 1) == 'V' || *(s + 1) == 'X') sum -= 1;
			else sum += 1;
		}
		else if (*s == 'X') 
		{
			if (*(s + 1) == 'L' || *(s + 1) == 'C') sum -= 10;
			else sum += 10;
		}
		else if (*s == 'C') 
		{
			if (*(s + 1) == 'D' || *(s + 1) == 'M') sum -= 100;
			else sum += 100;
		}
		s++;
	}
	return sum;
}
int main()
{
	char s[] = { "MCMXCIV"};
	printf("%d\n", romanToInt(s));
	return 0;
}

结果展示

 比较难想到的解法

int readRoman(char s) //返回罗马字母对应的数字
{
    int n[] = { 1,5,10,50,100,500,1000 }, i = 0;
    char strRoman[] = { "IVXLCDM" };
    while (s != strRoman[i])
        i++;
    return n[i];
}
int romanToInt(char* s) 
{
    int sum = readRoman(s[0]);
    int pre = readRoman(s[0]);//记录前一个罗马字符的数字大小
    for (int i = 1; s[i] != '\0'; i++) //历遍s里的每个罗马字符
    {
        if (pre < readRoman(s[i])) //特殊情况:前一个罗马数字大于后一个罗马数字
        {
            sum = sum + readRoman(s[i]) - 2 * pre;//之前加的pre现在减两倍的pre,相当于减了一个
        }
        else 
        {
            sum += readRoman(s[i]);//正常情况,直接加上
            pre = readRoman(s[i]);//往后移
        }
    }
    return sum;
}

int main()
{
	char s[] = { "MCMXCIV"};
	printf("%d\n", romanToInt(s));
	return 0;
}

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值