Pregunta

¿Cómo hago para tomar un número como 123456 y hacer que se imprime como 1 2 3 4 5 6?

¿Fue útil?

Solución

Como 'jamesdlin' ha mencionado en su comentario, el enfoque de GMan iba a funcionar, sin embargo, tendrá que almacenarlo en una memoria intermedia con el fin de imprimir en el orden correcto (su algoritmo imprimiría "6 5 4 3 2 1 "para la entrada de 123.456). En este punto, yo diría que sería mucho más sencillo de usar sólo sprintf como 'therefromhere' sugirió en su respuesta (si esto no es un algoritmo de asignación de clase, por supuesto).

En mi opinión, la forma más sencilla de hacerlo sería utilizar la recursividad, de esta manera usted puede imprimir dígitos en el orden correcto y sin el uso de tampones.

La implementación recursiva es muy simple:

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;
}

Entrada:

  

-78900456

Salida:

- 7 8 9 0 0 4 5 6

Editar : Gracias a Steve Jessop, quien sugirió un algoritmo correcto para números enteros positivos mientras estaba fuera. He cambiado el método anterior para imprimir correctamente para todos los enteros (positivos y negativos), sin que el último espacio.

Tenga en cuenta que podemos evitar la comprobación de valores negativos en todos los recursividad, al hacer la comprobación de una sola vez (en la función principal o donde sea), pero no lo hice escribirlo porque perderíamos más en la claridad de ganancia en el rendimiento.

Otros consejos

La forma más sencilla de hacer esto (aunque no la más rápida), probablemente sería la primera sprintf el número a un búfer de cadena, y luego bucle a través de la memoria intermedia printf - ing un personaje y un espacio a la vez.

No hay manera integrada de hacer esto en el formato estándar printf.

Un método común sería para extraer cada dígito, y luego imprimir ese dígito. No voy a dar el código, pero es la versión implementada de:

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 */

Esto será al revés. Lo dejo como ejercicio para que usted pueda arreglar eso. (Pista: En el bucle, poner el resultado en una matriz de caracteres, y cuando haya terminado de inicio en el último índice de la matriz de impresión y al revés.)


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++]);

Esto sólo funciona para enteros sin signo:

#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;
}
#include <stdio.h>
int main ()
{
    int a, b, c, d, e;
    printf("Write a number of four figures\n");
    scanf("%d", &a);
    printf("Your number is:\n");

    b = (a - (a % 1000)) / 1000;
    c = ((a - (a % 100)) / 100) - b * 10;
    d = ((a - (a % 10)) / 10) - b * 100 - c * 10;
    e = (a - b * 1000 - c * 100 - d * 10);

    printf("%d\t%d\t", b, c);
    printf("%d\t", d);
    printf("%d", e);

    return 0;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top