Converting integer to Roman Numeral

前端 未结 9 1303
轮回少年
轮回少年 2020-12-16 08:27

I have a test due in about four hours and one of the questions asks us to convert a user-inputed integer up to 100 into a roman numeral. I think my code is very close (I fou

相关标签:
9条回答
  • 2020-12-16 08:32

    //java code

    import java.io.*;

    public class 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++;
    
        }
    
    
    }
    

    }

    0 讨论(0)
  • 2020-12-16 08:35

    One major problem is here:

    if(input = 100)
    

    I think you mean

    if(input == 100)
    

    You would have found this very easy if you stepped through your code in a debugger. Remember that a debugger is a programmers best friend, and the first tool to use if things doesn't work as intended.

    0 讨论(0)
  • 2020-12-16 08:36

    This code will convert integers (less than 3999) to Roman Numerals.

    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;
    }
    
    0 讨论(0)
  • 2020-12-16 08:43

    I wrote this for fun; maybe useful. Note however, that it will not work for values greater than 1000. Can adapt it to suit your needs though. Here you go:

    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;
    }
    
    0 讨论(0)
  • 2020-12-16 08:43

    Here's my solution. A bit brute force-ish and could be refactored but actually runs pretty fast and was easy to debug (ran perfectly first try). It does have nested ifs so that you never check the 100s, 1000s etc if there are no 10s.

       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;
            }
    
    0 讨论(0)
  • 2020-12-16 08:44

    I think this can actually be solved much more simply than your attempt, where frankly I fail to understand what you are trying to do (but that's me).

    Anyway, it can just be a sequence of if/else, not even nested. All you need to do is to check what is the "largest" literal contained in the input number, note it and then subtract the value if represents from the input number. Continue in such a way until you get to 0.

    e.g. (I'm not sure this is C++ syntax, but you can adjust it of course):

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

    And so on, you can figure the rest out on your own (it's your test after all).

    Two things:

    • some literals can be repeated (3: III, 20: XX).
    • writing e.g. "XXXX" for 40 instead of "XL" is still a valid roman number (although less common), so if I were evaluating your test I would accept it, but that depends on the assignment. (http://en.wikipedia.org/wiki/Roman_numerals)
    0 讨论(0)
提交回复
热议问题