Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
| 基本字符 | I | V | X | L | C | D | M |
| 对应阿拉伯数字 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
string intToRoman(int num)
{
string M[]={"","M","MM","MMM"};
string C[]={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
string X[]={"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
string I[]={"","I","II","III","IV","V","VI","VII","VIII","IX"};
return M[num/1000]+C[(num%1000)/100]+X[(num%100)/10]+I[(num%10)];
}
string intToRoman2(int num) {
if (num>=1000) return "M"+intToRoman(num-1000);
if (num>=900) return "CM"+intToRoman(num-900);
if (num>=500) return "D"+intToRoman(num-500);
if (num>=400) return "CD"+intToRoman(num-400);
if (num>=100) return "C"+intToRoman(num-100);
if (num>=90) return "XC"+intToRoman(num-90);
if (num>=50) return "L"+intToRoman(num-50);
if (num>=40) return "XL"+intToRoman(num-40);
if (num>=10) return "X"+intToRoman(num-10);
if (num>=9) return "IX"+intToRoman(num-9);
if (num>=5) return "V"+intToRoman(num-5);
if (num>=4) return "IV"+intToRoman(num-4);
if (num>=1) return "I"+intToRoman(num-1);
return "";
}string intToRoman(int num) {
for (int i=12;i>=0;i--)
{
if (inte[i]<=num)
{
return roman[i]+intToRoman(num-inte[i]);
}
}
return "";
}
private:
int inte[13]={1,4,5,9,10,40,50,90,100,400,500,900,1000};
string roman[13]={"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};#include <iostream>
#include <string>
#include <vector>
using namespace std;
int romanToInt(string s) ;
string intToRoman(int num) ;
string intToRoman1(int num);
string intToRoman2(int num);
void main()
{
int n=2549;
cout<<n<<endl;
string res=intToRoman(n) ;
cout<<res<<endl;
cout<<romanToInt(res)<<endl;
string res1=intToRoman1(n) ;
cout<<res1<<endl;
cout<<romanToInt(res1)<<endl;
string res2=intToRoman2(n) ;
cout<<res2<<endl;
cout<<romanToInt(res2);
}
string intToRoman(int num)
{
string M[]={"","M","MM","MMM"};
string C[]={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
string X[]={"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
string I[]={"","I","II","III","IV","V","VI","VII","VIII","IX"};
return M[num/1000]+C[(num%1000)/100]+X[(num%100)/10]+I[(num%10)];
}
int inte[13]={1,4,5,9,10,40,50,90,100,400,500,900,1000};
string roman[13]={"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
string intToRoman1(int num) {
for (int i=12;i>=0;i--)
{
if (inte[i]<=num)
{
return roman[i]+intToRoman(num-inte[i]);
}
}
return "";
}
string intToRoman2(int num) {
if (num>=1000) return "M"+intToRoman(num-1000);
if (num>=900) return "CM"+intToRoman(num-900);
if (num>=500) return "D"+intToRoman(num-500);
if (num>=400) return "CD"+intToRoman(num-400);
if (num>=100) return "C"+intToRoman(num-100);
if (num>=90) return "XC"+intToRoman(num-90);
if (num>=50) return "L"+intToRoman(num-50);
if (num>=40) return "XL"+intToRoman(num-40);
if (num>=10) return "X"+intToRoman(num-10);
if (num>=9) return "IX"+intToRoman(num-9);
if (num>=5) return "V"+intToRoman(num-5);
if (num>=4) return "IV"+intToRoman(num-4);
if (num>=1) return "I"+intToRoman(num-1);
return "";
}
int romanToInt(string s)
{
/*roman['I']=1;
roman['V']=5;
roman['X']=10;
roman['L']=50;
roman['C']=100;
roman['D']=500;
roman['M']=1000; */
char *p=new char[s.size()];
strcpy(p,s.c_str());//将string型转为char型数组
vector<int> array;
array.resize(s.size());
int n=0;
for (int i=0;i<s.size();i++)
{
switch (p[i])
{
case 'I':array[i]=1;break;
case 'V':array[i]=5;break;
case 'X':array[i]=10;break;
case 'L':array[i]=50;break;
case 'C':array[i]=100;break;
case 'D':array[i]=500;break;
case 'M':array[i]=1000;break;
default:cout<<"error\n";
}
if (i==0)
{
n+=array[i];
}
else
{
if (array[i]<=array[i-1])
{
n+=array[i];
}
else
{
n+=array[i]-2*array[i-1];
}
}
}
return n;
}
原文:http://blog.csdn.net/sinat_24520925/article/details/45602831