罗马数字到十进制

时间:2016-08-11 03:26:05

标签: c

尝试实现一个非常简单的Roman Numeral到Decimal转换器,但是如果字符串中有任何非罗马数字字符,似乎无法找到程序返回-1的方法。这是我到目前为止所做的。

#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"));
}

第一个应该返回17,第二个应该返回-1。但是它们都返回-1,但如果我删除else语句,则第一个返回17,第二个返回100.

感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

apply plugin: 'com.android.application' android { compileSdkVersion 24 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.delbridge.seth.alarm" minSdkVersion 19 targetSdkVersion 24 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { debuggable true } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:24.1.1' compile 'com.mcxiaoke.volley:library-aar:1.0.0' compile 'org.jsoup:jsoup:1.9.2' compile 'org.jdeferred:jdeferred-android-aar:1.2.4' compile 'com.google.android.gms:play-services-appindexing:9.4.0' compile 'com.google.android.gms:play-services:9.4.0' compile 'com.google.firebase:firebase-ads:9.4.0' compile 'com.google.android.gms:play-services-ads:9.4.0' compile 'com.google.android.gms:play-services-auth:9.4.0' compile 'com.google.android.gms:play-services-gcm:9.4.0' compile 'com.android.support:support-v4:24.1.1' compile 'com.android.support:design:24.1.1' compile 'com.android.support:cardview-v7:24.1.1' compile 'com.android.support:recyclerview-v7:24.1.1' } apply plugin: 'com.google.gms.google-services' if() if() if()更改为else if() else if () else if()

else

答案 1 :(得分:2)

不是一个真正的答案,只是一些有趣/另类的方式来看问题。如果你不考虑只是添加“数字”值,它确实解决了这个问题。

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