Как я пошел бы о взятии числа как 123456
и наличие его печатает как 1 2 3 4 5 6
?
Как упомянул в его комментарии «Джеймсдлин», подход GMan будет работать, однако вам нужно будет хранить его в буфере, чтобы распечатать в правильном порядке (его алгоритм будет распечатать «6 5 4 3 2 1» для ввода 123456). На данный момент я бы сказал, что было бы намного проще просто использовать 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
Редактировать : Благодаря Стиву Джессопу, Кто Предложил правильный алгоритм для позитивных целых чисел, пока я отсутствовал. Я изменил вышеуказанный способ, чтобы правильно распечатать для всех ints (положительных и отрицательных), без последнего пространства.
Обратите внимание, что мы можем избежать проверки отрицательных значений в каждой рекурсии, выполнив проверку только один раз (в основной функции или везде), но я не писал ее, потому что мы потеряем больше, чем ущерб.
Самый простой способ сделать это (хотя и не самый быстрый), вероятно, будет первым Sprintf
число в строку буфера, а затем цикл через буфер PrintF
-я на один символ и одно пространство за раз.
Там нет встроенного способа сделать это в стандартном PrintF
Форматирование.
Обычным методом будет извлечение каждой цифры, а затем печать этой цифры. Я не буду давать вам код, но это реализованная версия:
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');
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++]);
Это только работает только для целых чисел без знака:
#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;
}