Mikey
Mikey

Reputation: 149

Roman Numeral To Decimal

Trying to implement a very simple Roman Numeral to Decimal converter but can't seem to figure out a way for the program to return -1 if any non-roman numeral characters are in the string. This is what I have so far.

#include <stdio.h>
#include <ctype.h>

int convertFromRoman(const char *s)
{

int i = 0;
int total = 0;

while (s[i] != '\0') {

    if (isalpha(s[i]) == 0) {
        return -1;
    }

    if (toupper(s[i]) == 'I') {
        total += 1;
    }

    if (toupper(s[i]) == 'V') {
        total += 5;
    }

    if (toupper(s[i]) == 'X') {
        total += 10;
    }

    if (toupper(s[i]) == 'L') {
        total += 50;
    }

    if (toupper(s[i]) == 'C') {
        total += 100;
    }

    if (toupper(s[i]) == 'D') {
        total += 500;
    }

    if (toupper(s[i]) == 'M') {
        total += 1000;
    } else {
        return -1;
    }

    i++;
}

if (total == 0) {
    return -1;
}

return total;
}



int main()
{
    printf("%d\n", convertFromRoman("XVII"));
    printf("%d\n", convertFromRoman("ABC"));
}

The first one should return 17 and the second one should return -1. However they both return -1 but if I remove the else statement, the first one returns 17 and the second one returns 100.

Any help is appreciated.

Upvotes: 3

Views: 206

Answers (2)

Tibrogargan
Tibrogargan

Reputation: 4603

Not really an answer, just a bit of fun/alternate way of looking at the problem. It does solve the problem if you're not considering ordering just adding "digit" values.

char *romanNumerals = "IVXLCDM";
int values[] = { 1, 5, 10, 50, 100, 500, 1000 };

int convertFromRoman(const char *s) {
    int val = 0;
    for (int i = 0; s[i]; i++) {
        char *idx;
        if (NULL == (idx = strchr(romanNumerals, toupper(s[i])))) {
            return -1;
        }
        val += values[idx - romanNumerals];
    }
    return val;
}

Upvotes: 2

chux
chux

Reputation: 154075

Change if() if() if() else to if() else if () else if() else

   if (toupper(s[i]) == 'I') {
        total += 1;
    }

    else if (toupper(s[i]) == 'V') {
        total += 5;
    }

    else if (toupper(s[i]) == 'X') {
        total += 10;
    }

    ....

    else if (toupper(s[i]) == 'M') {
        total += 1000;
    } else {
        return -1;
    }

Upvotes: 4

Related Questions