考えられるアプローチの1つ:
#include <stdio.h>
char *digits[10] = {
"Zero", "One", "Two", "Three", "Four",
"Five", "Six", "Seven", "Eight", "Nine"
};
int main() {
int num, digit;
long long tenth = 1;
printf("Please enter an integer: \n");
scanf("%d", &num);
while (tenth < num) {
tenth *= 10;
}
while (tenth > 1) {
tenth /= 10;
digit = num / tenth;
num %= tenth;
printf("%s ", digits[digit]);
}
return 0;
}
デモ. 。今説明のために:
何よりもまず、使用することはほとんど意味がありません switch
ここ:数字は本質的にかなり線形です。したがって、彼らの名前は、代わりに一連の文字列に保存することができます(そしてすべきです)。char *digits[10]
このコードで)。次に、この数字をインデックスとして使用してこの配列にアクセスするだけで、特定の数字のラベルを取得できます。
第二に、このプログラムの重要な問題は、入力から各数字を個別に抽出することです。右から左に行く方が簡単です(の結果を取る number % 10
, 、 割当 number / 10
に number
, 、繰り返し)、しかし、ここでは別の方法で何かをするべきです - 左から右。だからこれが私たちがしていることです:
- 計算します
tenth
- 指定された数よりも大きい10の最初のパワー(たとえば、546で作業している場合、それは1000になります)
- 後続の各反復で:
- 分ける tenth
10までに
- の整数分割の結果を処理します number
に tenth
- に割り当てます number
残り number
で割った tenth
最初の反復で tenth
100(1000/10)になり、546/100は5(整数を整数で割った整数、小数は切り捨てられます)を与え、546%100は46を与えます - それは2回目の反復の数として保存されます。
2番目の反復で tenth
10(100/10)になり、46/10は4、46%10を与えます。 tenth
すべての数字が処理されるため、1に等しくなり、ループが停止します。