码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode_13题——Roman to Integer(string,数学问题)

时间:2015-04-20 16:32:46      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

Roman to Integer

 Total Accepted: 35099 Total Submissions: 100583My Submissions

 

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

 

Hide Tags
 Math String
Have you met this question in a real interview? 
Yes
 
No
 

Discuss

思路

首先,学习一下罗马数字,参考罗马数字 
罗马数字是最古老的数字表示方式,比阿拉伯数组早2000多年,起源于罗马 
罗马数字有如下符号: 

基本字符 I V X L C D M
对应阿拉伯数字 1 5 10 50 100 500 1000


计数规则: 相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4正常使用时,连续的数字重复不得超过三次在一个数的上面画横线,表示这个数扩大1000倍(本题只考虑3999以内的数,所以用不到这条规则) 
其次,罗马数字转阿拉伯数字规则(仅限于3999以内): 
从前向后遍历罗马数字,如果某个数比前一个数小,则加上该数。反之,减去前一个数的两倍然后加上该数 

#include<iostream>
#include<string>
using namespace std;

int numebr_table(char str)
{
	switch(str)
	{
	case ‘I‘:{return 1;}
	case ‘V‘:{return 5;}
	case ‘X‘:{return 10;}
	case ‘L‘:{return 50;}
	case ‘C‘:{return 100;}
	case ‘D‘:{return 500;}
	case ‘M‘:{return 1000;}
	}
}

int romanToInt(string s) {
	int last_result=0;
	int len=s.size();
	int i=1;
	if(len==0)
		return 0;
	if(len==1)
		return numebr_table(s[0]);
	last_result=numebr_table(s[0]);
	while(i<len)
	{
		if(numebr_table(s[i])<=numebr_table(s[i-1]))
			last_result+=numebr_table(s[i]);
		else
			last_result=last_result+(numebr_table(s[i])-2*numebr_table(s[i-1]));
		i++;
	}
	return last_result;
}

int main()
{
	string s="CIII";
	cout<<romanToInt(s)<<endl;
	system("pause");
	return 1;

}

  

leetcode_13题——Roman to Integer(string,数学问题)

标签:

原文地址:http://www.cnblogs.com/yanliang12138/p/4441630.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!