用c语言在线编译 Convert from Roman Numerals

用c语言在线编译 Convert from Roman Numerals

Read a string from command line arg.

Assume it's a Roman numeral.

Output the Arabic form.

Treat "v" as 5 and "V" as 5000 (aka "v-bar"), etc.

You must handle the subtractive rule.

Perform basic error checking.

Desired: do conversion in a function.

用 URL

回答引自chatgpt

#include <stdio.h>
#include <string.h>
int convertRomanToArabic(char *roman);
int main(int argc, char *argv[])
{
    if (argc != 2) {
        printf("Usage: %!s <roman_numeral>\n", argv[0]);
        return 1;
    }
    int arabic = convertRomanToArabic(argv[1]);
    if (arabic == -1) {
        printf("Invalid Roman Numeral\n");
        return 1;
    }
    printf("%!s = %!d\n", argv[1], arabic);
    return 0;
}
int convertRomanToArabic(char *roman)
{
    int arabic = 0;
    int prev = 0;
    int curr;
    for (int i = 0; i < strlen(roman); i++) {
        switch (roman[i]) {
            case 'I':
                curr = 1;
                break;
            case 'V':
                curr = 5;
                break;
            case 'X':
                curr = 10;
                break;
            case 'L':
                curr = 50;
                break;
            case 'C':
                curr = 100;
                break;
            case 'D':
                curr = 500;
                break;
            case 'M':
                curr = 1000;
                break;
            default:
                return -1;
        }
        if (curr > prev) {
            arabic -= prev;
        } else {
            arabic += prev;
        }
        prev = curr;
    }
    arabic += prev;
    return arabic;
}

直接上代码

#include <stdio.h>
#include <string.h>

int roman_to_arabic(const char * roman) {
    int result = 0;
    int len = strlen(roman);
    for (int i = 0; i < len; i++) {
        char c = roman[i];
        if (c == 'M') {
            result += 1000;
        } else if (c == 'D') {
            result += 500;
        } else if (c == 'C') {
            if (i + 1 < len && (roman[i + 1] == 'D' || roman[i + 1] == 'M')) {
                result -= 100;
            } else {
                result += 100;
            }
        } else if (c == 'L') {
            result += 50;
        } else if (c == 'X') {
            if (i + 1 < len && (roman[i + 1] == 'L' || roman[i + 1] == 'C')) {
                result -= 10;
            } else {
                result += 10;
            }
        } else if (c == 'V') {
            result += 5;
        } else if (c == 'I') {
            if (i + 1 < len && (roman[i + 1] == 'V' || roman[i + 1] == 'X')) {
                result -= 1;
            } else {
                result += 1;
            }
        }
    }
    return result;
}

int main(int argc, char * argv[]) {
    if (argc < 2) {
        printf("Usage: %s <roman_numeral>\n", argv[0]);
        return 1;
    }
    printf("%d\n", roman_to_arabic(argv[1]));
    return 0;
}