您的位置:首页 > 编程语言 > C语言/C++

C++之整数转化为罗马数字(11)---《那些奇怪的算法》

2017-10-15 11:07 525 查看
参考:《one-day-one-leetcode》

要求:将整形数字转化为罗马数字,我们都知道罗马数字有7个,分别为I(1),V(5),X(10),L(50),C(100),D(500),M(1000),这有个弊端,就是我们需要限制我们的输入在1~3999内,因为大于3999或者小于1无法使用罗马数字表示!

代码实现:

1)_simple我们列举了所有可能出现的情况,然后进行相应的匹配,代码逻辑简单;

2)第二种我们按照分类情况进行讨论,逻辑上比较简单,但是代码实现比较冗余。

#include <iostream>
#include <string>
#include <vector>

using namespace std;

string intToRoman_simple(int num){
int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
string numerals[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
string str = "";
for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++){
string str_t = "";
while (num >= values[i]){
num -= values[i];
str_t += numerals[i];
}
str += str_t;
}
return str;
}
string intToRoman(int num){
string str = "";
string roman[7] = { "I", "V", "X",
"L", "C", "D", "M" };
int j = 0;
while (num){
string str_t = "";
int temp = num % 10;
if (temp < 4){
int count = temp;
while (count--){
str_t += roman[j];
}
}
else if (temp == 4){
str_t += roman[j];
str_t += roman[j + 1];
}
else if (temp >= 5 && temp <= 8){
str_t += roman[j + 1];
int count = temp - 5;
while (count--){
str_t += roman[j];
}
}
else{
str_t += roman[j];
str_t += roman[j + 2];
}
str = str_t + str;
cout << str_t << endl;
cout << str << endl;
cout << "==================" << endl;
num /= 10;
j = j + 2;
}
return str;

}
int main(){
int num = 3745;
cout << intToRoman_simple(num) << endl;
return 0;
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐