Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
Subscribe to seewhich companies asked this question.
Solving problemsusing C++
class Solution{
public:
int romanToInt(string s) {
// Add yours code
}
};
/*
Author:杨柳
Date:2017/5/4
IDE:DEV-c++
罗马数字规则:
1, 罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。
罗马数字中没有"0"。
2, 重复次数:一个罗马数字最多重复3次。
3, 右加左减:
在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
4, 左减的数字有限制,仅限于I、X、C,且放在大数的左边只能用一个。
(*) V 和 X 左边的小数字只能用Ⅰ。
(*) L 和 C 左边的小数字只能用X。
(*) D 和 M 左 边的小数字只能用C。
用户输入一个数字,遍历这个数字,sum计算和,如果前一个数字大于后一个直接相加,如果小于后一个数字,加和用sum减去前一个较小的数字的两倍
例如:MCMLXX 代表1970
M>C sum=1000+100 C<M sum=sum+1000-100*2 M>L sum=sum+50 L>X sum=sum+20 X=X sum=sum+20
*/
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
class Solution {
public:
int romanToInt(string s) {
int sum=changeint(s[0]);
for (int i = 0; i < s.length()-1; i++) {
if (changeint(s[i]) < changeint(s[i+1])) {
sum += changeint(s[i+1]) - 2 * changeint(s[i]); // 如果i比i+1小的话,则将总和sum减去i这个地方数的两倍,同时加上i+1
}
else {
sum += changeint(s[i+1]); // 如果,i比i+1大的话,直接相加
}
}
return sum;
}
int changeint(char ch) {
switch (ch) {
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;
}
}
// 阿拉伯数字转罗马数字
/*string IntToroman(int num){
string sum;
if (num >= 1000) {
sum += changeroman(num - num % 1000);
num %= 1000;
}
if (num >= 100) {
sum += changeroman(num - num % 100);
num %= 100;
}
if (num >= 10) {
sum += changeroman(num - num % 10);
num %= 10;
}
sum += changeroman(num);
return sum;
}
string changeroman(int num) {
switch(num) {
case 1: return "I";
case 2: return "II";
case 3: return "III";
case 4: return "IV";
case 5: return "V";
case 6: return "VI";
case 7: return "VII";
case 8: return "VIII";
case 9: return "IX";
case 10: return "X";
case 20: return "XX";
case 30: return "XXX";
case 40: return "XL";
case 50: return "L";
case 60: return "LX";
case 70: return "LXX";
case 80: return "LXXX";
case 90: return "XC";
case 100: return "C";
case 200: return "CC";
case 300: return "CCC";
case 400: return "CD";
case 500: return "D";
case 600: return "DC";
case 700: return "DCC";
case 800: return "DCCC";
case 900: return "CM";
case 1000: return "M";
case 2000: return "MM";
case 3000: return "MMM";
}
}*/
//阿拉伯数字转罗马数字(方法二)
string IntToroman(int num){
char ch[][10] ={ "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" , "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" ,
"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" , "", "M", "MM", "MMM", "", "",};
string sum = ch[3][num / 1000] + ch[2][num % 1000 / 100] +ch[1][num % 100 / 10] +ch[0][num % 10];
return sum;
}
};
int main(){
Solution sl;
string str;
int num;
cout<<"罗马字符转化为阿拉伯数字"<<endl;
cout<<"请输入一个罗马数字:"<<endl;
cin>>str;
cout<<"罗马数字所对应的阿拉伯数字为:"<<endl;
cout<<sl.romanToInt(str)<<endl;
cout<<"请输入一个阿拉伯数字:"<<endl;
cin>>num;
cout<<"阿拉伯数字所对应的罗马数字为:"<<endl;
cout<<sl.IntToroman(num);
}