C ++:将整数转换为罗马数字的困惑

时间:2014-02-07 02:04:40

标签: c++ string while-loop switch-statement

我正在为我的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;  
}

3 个答案:

答案 0 :(得分:0)

switch(num)
{
case 40:                                    
   rep += "XL"; 
   num -= 40;                                   
   break;                                     
case 90:
   rep += "XC";
   num -= 90;
   break;
}

它们仅在数字为4090时才有效。尝试将数字分开而不是比较相等。

答案 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;
}