用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;
}