123456
のような数字を取り、それを として印刷するにはどうすればよい1 2 3 4 5 6
ですか?
7 に答える
「jamesdlin」がコメントで述べたように、GMan のアプローチは機能しますが、正しい順序で出力するには、バッファに保存する必要があります (彼のアルゴリズムは入力用に「6 5 4 3 2 1」を出力します)。 123456)。この時点で、彼の回答で提案されている「therefromhere」のように sprintf を使用する方がはるかに簡単だと思います(もちろん、これがアルゴリズムクラスの割り当てでない場合)。
私の意見では、最も簡単な方法は再帰を使用することです。この方法では、バッファを使用せずに正しい順序で数字を出力できます。
再帰的な実装は非常に単純です。
void PrintfRecursivly(int number)
{
if (number < 0)
{
number *= -1;
printf("- ");
}
if (number > 10)
{
PrintfRecursivly(number / 10);
printf(" ");
}
printf("%d", number % 10);
}
int main()
{
int number = -78900456;
PrintfRecursivly(number);
return 0;
}
入力:
-78900456
出力:
- 7 8 9 0 0 4 5 6
EDIT : 私が留守中に正の整数の正しいアルゴリズムを提案してくれた Steve Jessop に感謝します。上記の方法を変更して、最後のスペースなしですべての整数 (正と負) を正しく出力するようにしました。
すべての再帰で負の値をチェックすることを避けることができることに注意してください。これは、チェックを 1 回だけ (メイン関数またはどこでも) 実行することで実現できますが、パフォーマンスの向上よりも明快さのほうが失われるため、記述しませんでした。
一般的な方法は、各数字を抽出してから、その数字を出力することです。コードは提供しませんが、次の実装バージョンです。
int d; // your number
/* While `d` is not zero */
/* Modulus `d` with 10 to extract the last digit */
/* Print it, with your space */
/* Divide by 10 to remove the last digit */
/* Repeat */
これは逆になります。それを修正するための演習として残します。(ヒント: ループ内で、結果を文字の配列に入れ、終了したら、配列の最後のインデックスから開始して逆方向に出力します。)
char buffer[50];
int myNum = 123456;
int n;
int i;
n = snprintf(buffer, sizeof buffer, "%d", myNum);
for (i = 0; i < n; i++)
{
putchar(buffer[i]);
putchar(' ');
}
putchar('\n');
これは、符号なし整数に対してのみ機能します。
#include <stdio.h>
#include <math.h>
void print_number(unsigned int number) {
int n = number, c = 0, p;
while (n > 0) {
n /= 10;
c++;
}
for (n = c - 1; n >= 0; n--) {
p = pow(10, n);
printf("%d ", number / p);
number -= number / p * p;
}
printf("\n");
}
int main(int argc, char *argv[]) {
print_number(1);
print_number(12);
print_number(123);
print_number(1234);
print_number(12345);
print_number(1234567);
print_number(12345678);
print_number(123456789);
return 0;
}
int number = 123456;
char strNumber[64];
strNumber[0] = '\0';
sprintf_s(strNumber, "%d", number);
int i = 0;
while(strNumber[i] != '\0')
printf("%c ", strNumber[i++]);