将整数转换为罗马数字

时间:2013-10-09 07:48:03

标签: c++

我在大约四个小时内完成测试,其中一个问题要求我们将用户输入的整数转换为100到罗马数字。我认为我的代码非常接近(我找到了一个我用作指南的youtube视频)但是我的代码根本不起作用:(。有人能发现错误吗?编辑:啊sry sry sry,问题是那个当它编译时,它没有给出罗马数字。就像我输入一个值,它给了我一个空白。

    #include "stdafx.h"
#include <iostream>
#include <string>
    using namespace std;


int main()
{
    string romnum;
    int input;
    int num;
    cout << "Type in an integer: ";
    cin >> input;
    if(( input >= 101) || (input <= 0)) // <-- this is the upper bound
    {
        cout << "\n INVALID INPUT";
    }
    else
    {
        if(input = 100)
        {
            romnum + 'C';

        }
        input %= 100; // gets the remainder after dividing by 100

        if(input <= 10)
        {
            num = (input/10); // now we are dealing with number in 10s place
            if(num == 9)
            {
                romnum += "XC";
            }
            else if(num >= 5)
            {
                romnum += 'L';

                for(int i=0; i < num - 5;i++)
                {
                    romnum += 'X';
                }
            }
            else if(num == 4)
            {
                romnum += "XL";
            }
            else if(num >= 1)
            {
                for(int i=0; i>num; i++)
                {
                    romnum += 'X';
                }
                input %= 10;
            }
            if(num >= 1)
            {
                num = input; //  now we are dealing with number in ones place
                if(num == 9)
                {
                    romnum += "IX";
                }
                else if(num >= 5)
                {
                    romnum += 'V';
                    for(int i=0; i < num - 5; i++)
                    {
                        romnum += 'I';
                    }
                }
                else if(num == 4)
                {
                    romnum += "IV";
                }
                else if(num >= 1)
                {
                    for(int i = 0; i < num; i++)
                    {
                        romnum += 'I';
                    }
                }
        cout << "The Roman Numeral is: " << romnum;

            }
        }



        cout << "The Roman Numeral is: " << romnum;
    }
    int f;
    cin >> f;
    return 0;
}

enter code here

9 个答案:

答案 0 :(得分:8)

来自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;
}

答案 1 :(得分:5)

此代码将整数(小于3999)转换为罗马数字。

string int_to_roman(int a)
{
    string ans;
    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"};
    ans = M[a/1000]+C[(a%1000)/100]+X[(a%100)/10]+I[(a%10)];
    return ans;
}

答案 2 :(得分:4)

这里有一个主要问题:

if(input = 100)

我认为你的意思是

if(input == 100)

如果您在调试器中逐步执行代码,您会发现此非常简单。请记住,调试器是程序员最好的朋友,也是第一个在事情无法正常工作时使用的工具。

答案 3 :(得分:1)

我认为这实际上可以比你的尝试更简单地解决,坦率地说,我不明白你想要做什么(但那就是我)。

无论如何,它只能是if / else的序列,甚至不是嵌套的。 您需要做的就是检查输入数字中包含的“最大”字面值,注意它,然后从输入数字中减去值。继续这样,直到你到达0。

e.g。 (我不确定这是C ++语法,但你当然可以调整它):

string roman = ""
if(input == 100)
{
    roman += "C";
    input -= 100;
}

if(input >= 50)
{
    roman += "L";
    input -= 50;
}

等等,你可以自己计算出其余部分(毕竟这是你的测试)。

两件事:

  • 可以重复一些文字(3:III,20:XX)。
  • 写作,例如40“而不是”XL“的”XXXX“仍然是有效的罗马数字(虽然不常见),所以如果我在评估你的测试我会接受它,但这取决于作业。 (http://en.wikipedia.org/wiki/Roman_numerals

答案 4 :(得分:0)

Joachim发现了第一个问题,这个代码总是被执行并用100覆盖输入。

    if(input = 100)
    {
        romnum + 'C';

    }

现在,你为什么不看到什么?那是因为你错过了另一个 =。所有其他代码都正确使用+=,但这使用+。因此,这不会将结果字符串分配回romnum

顺便说一句,由于romnum仍为空,您可以互换使用romnum = 'C'romnum += 'C'

答案 5 :(得分:0)

我写这篇文章很有趣;也许有用。 但请注意,它不适用于大于1000的值。 可以根据您的需求进行调整。 你走了:

enum roman_digits{
    I=1,
    V=5,
    X=10,
    L=50,
    C=100,
    D=500,
    M=1000
};

std::string lookup(roman_digits v) {
    switch (v) {
    case I:
        return "I";
    case V:
        return "V";
    case X:
        return "X";
    case L:
        return "L";
    case C:
        return "C";
    case D:
        return "D";
    case M:
        return "M";
    default:
        return NULL;
    }
}

std::string to_roman(const int value) {
    roman_digits weight[] = { I, V, X, L, C, D, M };
    std::string result;
    int t;
    int i;

    if (value == 0) {
        return NULL;
    } else {
        unsigned int i;
        for (i = 0; i < sizeof(weight) / sizeof(roman_digits); ++i) {
            if (value == weight[i]) {
                return lookup(weight[i]);
            }
        }
    }
    i = 0;
    t = value;
    while (t > 0) {
        t = value;
        t /= weight[i++];
    }
    --i;
    int prev_wt_sub = i % 2 ? (i - 1) : (i - 2);
    if ((weight[i] - weight[prev_wt_sub]) < value) {
        result += lookup(weight[prev_wt_sub]) + lookup(weight[i]) +
                to_roman(value - (weight[i] - weight[prev_wt_sub]));
    } else if ((weight[i] - weight[prev_wt_sub]) > value) {
        prev_wt_sub += (value / weight[prev_wt_sub + 1] ? 1 : 0);
        result += lookup(weight[prev_wt_sub]) +
                to_roman(value - weight[prev_wt_sub]);
    } else {
        result += lookup(weight[prev_wt_sub]) + lookup(weight[i]);
    }

    return result;
}

答案 6 :(得分:0)

// java代码

导入java.io。*;

公共类NumberToRoman {

public static void main(String[] args) throws IOException{


    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Enter any number");
    int  num= Integer.parseInt(br.readLine());

     NumberToRoman n = new  NumberToRoman();
     n.conversion(num);

    }




public void conversion(int y) {
    int i=0;

    int decimal[] = {1000,900,500,400,100,90,50,10,9,5,4,1};
    String roman[]= {"M","CM","D","CD","C","XC","L","X","IX","V","IV","I"};
    while(y!=0) {
          while(y/decimal[i]!=0) {
              System.out.print(roman[i]);
              y=y-decimal[i];


          }
          i++;

    }


}

}

答案 7 :(得分:0)

将小数转换为罗马数字的函数 字符串toLongRoman(int x){

string Romanvalue;

string  Roman[13] = { "M","CM","D","CD", "C","XC", "L","XL", "X","IX","V","IV", "I" };
int Numbers[13] = { 1000, 900, 500,400, 100,90,50,40,10,9,5,4,1 };

for (int index = 0; index < 13; index++) {



        while (x >= Numbers[index]) {
            Romanvalue += Roman[index];


            x -= Numbers[index];

        }
    }

    return Romanvalue;

答案 8 :(得分:0)

这是我的解决方案。有点蛮力的,可以重构,但实际上运行速度非常快,并且易于调试(最好先尝试一下)。它确实嵌套了ifs,因此如果没有10s,就永远不会检查100s,1000s等。

   string intToRoman(int num) {
            string retVal="";
            int ones=num%10;
            cout<<ones<<endl;
            int onesRest=(num-ones)/10;
                switch (ones){
                    case 1:
                        retVal="I";
                        break;
                    case 2:
                        retVal="II";
                        break;
                    case 3:
                        retVal="III";    
                        break;
                    case 4:
                        retVal="IV";
                        break;
                    case 5:
                        retVal="V";    
                        break;
                    case 6:
                        retVal="VI";
                        break;
                    case 7:
                        retVal="VII";    
                        break;
                    case 8:
                        retVal="VIII";
                        break;
                    case 9:
                        retVal="IX";
                        break;
                }

            if(onesRest>0){
                int tens=onesRest%10;
                int tensRest=(onesRest-tens)/10;            
                switch (tens){
                    case 1:
                        retVal="X"+retVal;
                        break;
                    case 2:
                        retVal="XX"+retVal;
                        break;
                    case 3:
                        retVal="XXX"+retVal;   
                        break;
                    case 4:
                        retVal="XL"+retVal;
                        break;
                    case 5:
                        retVal="L"+retVal;   
                        break;
                    case 6:
                        retVal="LX"+retVal;
                        break;
                    case 7:
                        retVal="LXX"+retVal;  
                        break;
                    case 8:
                        retVal="LXXX"+retVal;
                        break;
                    case 9:
                        retVal="XC"+retVal;
                        break;

            }
            if(tensRest>0){
                int hundreds=tensRest%10;
                int hundredsRest=(tensRest-hundreds)/10;            
                switch (hundreds){
                    case 1:
                        retVal="C"+retVal;
                        break;
                    case 2:
                        retVal="CC"+retVal;
                        break;
                    case 3:
                        retVal="CCC"+retVal;   
                        break;
                    case 4:
                        retVal="CD"+retVal;   
                        break;
                    case 5:
                        retVal="D"+retVal;      
                        break;            
                    case 6:
                        retVal="DC"+retVal;   
                        break;
                    case 7:
                        retVal="DCC"+retVal;       
                        break;
                    case 8:
                        retVal="DCCC"+retVal;   
                        break;
                    case 9:
                        retVal="CM"+retVal;      
                        break;
                }
                if(hundredsRest>0){
                    int thousands=hundredsRest%10;           
                    switch (thousands){
                        case 1:
                            retVal="M"+retVal;   
                            break;
                        case 2:
                            retVal="MM"+retVal;   
                            break;
                        case 3:
                            retVal="MMM"+retVal;     
                            break;    
                    }

                }  
            }    
        }
            return retVal;
        }