一時ストレージに配列を使用するソリューション:
int octal, total = 0, length=0;
char storage[12]; /* 11 octal digits add up to > 1 billion */
octal = 123;
while (octal > 0)
{
storage[length] = octal % 8;
octal /= 8;
length++;
}
while (--length >= 0)
printf ("%d", storage[length]);
printf ("\n");
(私はたまたま C モードだったので、必要に応じてprintf
s. に変更しcout
ます。)
最も重要なポイントは、storage
サイズに拘束されることです。妥当なサイズに設定できます --整数に入れることができる正の 8 進数の最大サイズは017777777777
-- であり、不当なサイズでも許容されます (20 に設定することもできますが、これは追加の 8 バイトを浪費するだけです; 最近では、それは何もありません)。ストレージ サイズは、入力できる最大数の 8 進数での表現の大きさによって決まります。
両方8
の を2
;に変更するとします。次に、この同じルーチンをバイナリ出力に使用できます。しかし、その時点で、出力文字数は 31 に増加します。int
(最後のビットが数値を負に切り替えるため、の [可能性の高い] ビット数より 1 少ない。負の数値を処理するには別のコードが必要です。)
10以下のすべてのベース(「ベース10」自体を含む)に対してそのまま機能します。同じコードを拡張して、10 を超える "12 進数" (基数 12) や 16 進数 (基数 16) などを処理する場合は、printf
行を変更する必要があります。これにより、コードが base 36 ("sexatrigesimal") まで機能するようになります。慣例により、9 より大きい「数字」は A、B、C などと表記されます。
while (--length >= 0)
printf ("%c", storage[length] < 10 ? storage[length]+'0' : storage[length]+'A'-10);
(私が書いているときにこれを作成しているので、より多くの入力が必要な別の ではなく、便宜上三項演算子を使用しました。(OTOH、コメントを追加するとゲインが無効になります。まあ、少なくともあなたは三項演算子、およびいくつかの基数の名前。))?..:..
if..else
別の解決策は、再帰を使用することです。これは、メモリ内のスペースを事前に割り当てる必要がないため、便利な方法です。代わりに、内部呼び出しスタックに依存します。
原則は、数字の最後の桁のみを出力する関数を作成することですが、その前に、余りが 0 でない限り、数字の余りで自分自身を呼び出します。
そのため、関数はそれ自体を呼び出し、必要な数値を出力します。最初に自分自身を呼び出すため、呼び出されたバージョンは、本来あるべき番号(「元の」関数の桁の左側にある番号) を出力します。印刷する桁がなくなるまで、以下同様です。その時点から、最後に呼び出された関数はその番号 (左端の桁) を出力し、それが呼び出された関数に戻り、その番号 (右にもう 1 つ) を元の番号までずっと出力します。電話。
再帰は習得するのに非常に優れたスキルなので、ぜひ試してみてください!