7

我正在解决一个问题,其中给出了一个正整数,我必须用文字显示它。

例如,如果一个数字是2134输出应该是"two one three four"。如果我使用模数运算符并使用递归技术,我会从最低有效位开始获得数字,即"four three one two"

我也可以反转数字,然后使用模运算符,但我正在寻找更好的方法。

解决这个问题的更好方法是什么?我缺少什么概念?

4

5 回答 5

5

我的简单回答:

void printNum(int x)
{
    static const char * const num[] = {
        "zero ", "one ", "two "  , "three ", "four ",
        "five ", "six ", "seven ", "eight ", "nine "
    };

    if (x < 10) {
        printf(num[x]);
        return;
    }
    printNum(x / 10);
    printNum(x % 10);
}

编辑

经过更多的试验和调整,我想出了这个版本。我认为这是我能做的最“纯粹”的递归函数。

void printNum(int x)
{
    static const char * const num[] = {"zero ",  "one ", "two ", "three ",
                                       "four ",  "five ", "six ", "seven ",
                                       "eight ", "nine "};
    (x < 10)? printf(num[x]) : (printNum(x / 10), printNum(x % 10));
}
于 2013-06-06T17:03:28.337 回答
2

如果您正在寻找递归解决方案:

void num2word(int n) {
    if (n / 10 == 0) {
        // print the word for n
    }
    else {
        num2word(n / 10);
        // print the word for n % 10
    }
}
于 2013-06-06T16:33:14.643 回答
2

寻求纯数学答案,因为我认为这就是您要寻找的:

#include <math.h>
#include <stdio.h>

main() {
    long long mynum = 2987612345;
    long long firstDigitValue;
    int       firstDigit;
    char *names[] = { "zero", "one", "two", "three", "four", "five",
                      "six", "seven", "eight", "nine" };

    while (mynum > 0) {
        firstDigit = (int) (mynum/pow(10,(int)log10(mynum)));
        firstDigitValue = firstDigit * pow(10,(int)log10(mynum));
        mynum -= firstDigitValue;
        printf("%s ", names[firstDigit]); 
    }
    printf("\n");
}

然后运行它会产生:

two nine eight seven six one two three four five 

它应该与 long long 可以处理的任何大小的数字一起使用(在其他语言中,或者使用 C 中的大数字库,它可以处理任意大的东西)。

现在...我不确定使用 log10 和 pow 是最快的。但这是最有趣的:-)

于 2013-06-06T16:43:12.127 回答
1

如果它是一个以 null 结尾的 char *,那么为什么不这样做:

int i = 0;
while(char[i] != null){
    switch(char[i]):

         case '1': printf("One "); break;
         ....
         i++;

}

如果不是 char *,则用 char * temp = itoa(number) 将其变成一个;

于 2013-06-06T16:13:24.810 回答
1
1234 / 1000 => 1
1234 % 1000 => 234     234 / 100 => 2
1234 % 100  => 34      34  / 10  => 3
1234 % 10   => 4

你可以很容易地围绕它构建一个循环,但你可以更轻松地使用 itoa、sprintf 和std::to_string

于 2013-06-06T16:20:45.123 回答