How to convert a roman number to an integer in C++

2 Answers

0 votes
#include <iostream>

static int roman_to_number(char ch) {
    switch(ch) {
        case 'I': return 1;  
        case 'V': return 5;  
        case 'X': return 10;  
        case 'L': return 50;  
        case 'C': return 100;  
        case 'D': return 500;  
        case 'M': return 1000;  
        default: return 0;
    }
}
 
int roman_to_integer(char *s) {
    int i, n = roman_to_number(s[0]);
 
    std::cout << "n: " << n << "\n";
    for (i = 1; s[i]; i++) {
        int previous_n = roman_to_number(s[i - 1]);
        int current_n = roman_to_number(s[i]);
        std::cout << "current_n: " << current_n << "\n";
        if (previous_n < current_n) {
            n = n - previous_n + (current_n - previous_n);
        } else {
            n += current_n;
        }
         
    }
    return n;
}
 
int main()
{
    char s[] = "XCVII";
 
    std::cout << roman_to_integer(s);
     
    return 0;
}




/*
XCVII =
XC+V+I+I =
90+5+1+1 =
97
*/

 
 
/*
run:
 
n: 10
current_n: 100
current_n: 5
current_n: 1
current_n: 1
97
 
*/

 



answered Aug 8, 2021 by avibootz
0 votes
#include <iostream>
#include <unordered_map>
#include <string>

int romanToInt(const std::string& s) {
    std::unordered_map<char, int> romanValues = {
        {'I', 1}, {'V', 5}, {'X', 10}, {'L', 50},
        {'C', 100}, {'D', 500}, {'M', 1000}
    };

    int total = 0;
    int prevValue = 0;

    for (char ch : s) {
        int currentValue = romanValues[ch];
        if (currentValue > prevValue) {
            total += currentValue - 2 * prevValue;
        } else {
            total += currentValue;
        }
        prevValue = currentValue;
    }

    return total;
}

int main() {
    std::string roman = "XCVII";
    
    std::cout << "The integer value of " << roman << " is " << romanToInt(roman) << std::endl;
}


/*
run:

The integer value of XCVII is 97

*/

 



answered Apr 23 by avibootz

Related questions

1 answer 49 views
1 answer 169 views
1 answer 42 views
1 answer 58 views
1 answer 45 views
1 answer 119 views
1 answer 193 views
193 views asked Oct 27, 2016 by avibootz
...