正の整数が与えられ、それを言葉で表示しなければならない問題を解決しています。
たとえば、数値が2134
の場合、出力は になります"two one three four"
。モジュラス演算子を使用して再帰手法を使用すると、最下位桁から数字が取得されます。"four three one two"
数値を逆にしてモジュラス演算子を使用することもできますが、より良い方法を探しています。
この問題を解決するためのより良いアプローチは何ですか?.どの概念が欠けていますか?
正の整数が与えられ、それを言葉で表示しなければならない問題を解決しています。
たとえば、数値が2134
の場合、出力は になります"two one three four"
。モジュラス演算子を使用して再帰手法を使用すると、最下位桁から数字が取得されます。"four three one two"
数値を逆にしてモジュラス演算子を使用することもできますが、より良い方法を探しています。
この問題を解決するためのより良いアプローチは何ですか?.どの概念が欠けていますか?
私の簡単な答え:
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));
}
それがあなたが探しているものだと思うので、純粋な数学の答えに行きます:
#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 の使用が最速かどうかはわかりません。でも、それが一番楽しいです:-)
1234 / 1000 => 1
1234 % 1000 => 234 234 / 100 => 2
1234 % 100 => 34 34 / 10 => 3
1234 % 10 => 4
その周りにループを簡単に構築できますが、 itoa 、 sprintf 、およびstd::to_stringを使用するとさらに簡単になる場合があります。
null で終了する char * の場合は、次のようにしてください。
int i = 0;
while(char[i] != null){
switch(char[i]):
case '1': printf("One "); break;
....
i++;
}
char * でない場合は、char * temp = itoa(number); で 1 つに変換します。