我正在为我的C ++课程开发一个程序。指南是创建一个转换器,将整数转换为罗马数字,规范是我必须使用至少一个while语句,do while语句和一个开关。
我的代码大部分都在工作,但我不能涉及涉及4和9的特殊情况(例如(4,14,24,34等)40,(140,240等)400,(1400, 2400,3400等)和(9,19,29,39等)90,(190,290等)900,9000))为我工作。这是我此时的代码:
#include <iostream>
#include <string>
using namespace std;
int main( )
{
cout << "Please enter an interger." << endl;
int num = 0;
cin >> num;
string rep = "";
switch(num)
{
case 40:
rep += "XL";
num -= 40;
break;
case 90:
rep += "XC";
num -= 90;
break;
}
if (num >= 1000){
rep += string(num / 1000,'M');
num %= 1000;
}
if (num >= 500){
rep += string(num / 500,'D');
num %= 500;
}
if (num >= 100){
rep += string(num / 100,'C');
num %= 100;
}
if (num >= 50){
rep += string(num / 50,'L');
num %= 50;
}
if (num >= 10){
rep += string(num / 10,'X');
num %= 10;
}
if (num >= 5){
rep += string(num / 5,'V');
num %= 5;
}
if (num >= 1){
rep += string(num,'I');
num %= 1;
}
cout << num << endl;
cout << rep << endl;
return 0;
}
答案 0 :(得分:0)
switch(num)
{
case 40:
rep += "XL";
num -= 40;
break;
case 90:
rep += "XC";
num -= 90;
break;
}
它们仅在数字为40
或90
时才有效。尝试将数字分开而不是比较相等。
答案 1 :(得分:0)
我会首先找到一个合适的算法(谷歌为我制作了有用的结果),然后,在实施之后,我会找到一种方法来推动所需的三种控制结构。
我怀疑这些要求可能对您有所帮助。例如,让我们考虑一个简单的转换,即数字2000. This should produce "MM"。
让我们从这个想法开始吧。您的算法必须类似于:
while (the number is greater than zero) {
Check if the number is greater than 1000. If so, take 1000 off the number and put an "M" in the string.
}
此代码使用while循环(缺少当前代码)。
然后,您可以转到新的测试用例,例如100.这应该产生“C”。然后我会在200和300上工作,从上面开始循环来完成工作。
我在网上发现了一个有趣的算法,检查了大于400且小于500,并将其替换为“CD”。也许这会有助于你的思考。
答案 2 :(得分:0)
来自http://rosettacode.org/wiki/Roman_numerals/Encode#C.2B.2B
std::string to_roman(unsigned int value)
{
struct romandata_t { unsigned int value; char const* numeral; };
const struct romandata_t romandata[] =
{
{1000, "M"}, {900, "CM"},
{500, "D"}, {400, "CD"},
{100, "C"}, { 90, "XC"},
{ 50, "L"}, { 40, "XL"},
{ 10, "X"}, { 9, "IX"},
{ 5, "V"}, { 4, "IV"},
{ 1, "I"},
{ 0, NULL} // end marker
};
std::string result;
for (const romandata_t* current = romandata; current->value > 0; ++current)
{
while (value >= current->value)
{
result += current->numeral;
value -= current->value;
}
}
return result;
}