【问题标题】:How can I convert word numbers to ints in C?如何在 C 中将单词数字转换为整数?
【发布时间】:2023-04-10 12:28:01
【问题描述】:

这是我上一个问题的后续。我的代码要求用户输入数字的数字作为字符数组,以输出单词形式的数字。例如输入“2、13、20、54”输出“二、十三、二十、五十四”。该代码仅适用于小于 100 的数字,并且由于输入的是字符数组,因此如果输入了任何 3 位或更多位的数字,则会出现错误消息,通知用户该数字大于或等于 100。是反正有使用这个代码做相反的事情吗?例如,如果用户输入“六十一”,则输出将是“61”,如果用户输入“一百二十七”,则输出将是错误消息,因为该数字大于九十九。我用这个https://www.geeksforgeeks.org/convert-number-to-words/ 开始我的工作,我遇到的大多数其他解决方案都是在 python 中,我没有经验,但我的作业需要 C 中的解决方案。无论如何,是否可以为相应的字符串分配整数值?如“一:1、十一:11、二十:20等”我是否必须在我的代码中包含“数百、数千、数百万等”,或者如果检测到字符串不是我已经列出的表示数字大于 99 的字符串,我的代码是否有办法抛出错误?比如我输入“一千六百五十”,因为“千”和“百”没有出现在singledig、doubledig或multiplesoften中,这说明数字太大了?我怀疑需要一个循环来遍历输入字符串来检测这一点,但是我将如何使用我的输入创建一个字符串数组?

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

void convertnumtostring(char *num){
    int len = strlen(num);
    if(len==0){
        fprintf(stderr, "empty string\n");
        return;
    }
    if(len>2){
        fprintf(stderr, "number is is equal to or greater than 100\n");
        return;
    }

    char *singledig[]={"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    char *doubledig[]={"", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
    char *multiplesoften[]={"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};

    printf("\n%s: ", num);
    if(len==1){
        printf("%s\n", singledig[*num - '0']);
        return;
    }

        if(*num == '1'){
            int sum = *num - '0' + *(num + 1)- '0';
            printf("%s\n", doubledig[sum]);
            return;
        } else if(*num == '2' && *(num + 1) == '0'){
            printf("twenty\n");
            return;
        } else {
            int i = *num - '0';
            printf("%s ", i? multiplesoften[i]: "");
            ++num;
            if(*num != '0')
                printf("%s ", singledig[*num - '0']);
        }
}

int main(void){
    char input[10];
    printf("Enter a number: ");
    scanf("%s", input);
    convertnumtostring(input);
    return 0;   

}

【问题讨论】:

  • 如果您只需要识别完美、精确的匹配,您可以遍历所有 100 种可能性并进行比较。

标签: arrays c string io


【解决方案1】:

不幸的是,我看不到任何其他方式可以解决这个问题。对于您关于百万和数千案例的问题,是的,您必须包括案例,如果该词存在,您可以为该数字分配一个变量。您可以做的一件事是根据间距将单词分成不同的字符串。这将使代码更容易,然后使用 strcmp 进行比较。 例如:一百三十一。

str1 = one
str2 = hundred
str3 = and
str4 = thirty
str5 = one

strcmp(str1,result[i])

//result[i] 是一个二维数组,包含程序中的所有可能值。您还需要遍历这些案例。

同样在二维数组中,您可以保持最可能的值首先出现。也就是三十、四十等。

对于单个数字,您可以检查字符串的长度并避免这种检查并调用另一个函数,这样时间复杂度就不会增加。 这是我能想到的一种解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2017-03-08
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多