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

それがあなたが探しているものだと思うので、純粋な数学の答えに行きます:

#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
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 に答える
1

null で終了する char * の場合は、次のようにしてください。

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

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

}

char * でない場合は、char * temp = itoa(number); で 1 つに変換します。

于 2013-06-06T16:13:24.810 に答える