Question

Comment dois-je de prendre un certain nombre comme 123456 et l'avoir comme impression 1 2 3 4 5 6?

Était-ce utile?

La solution

« jamesdlin » a mentionné dans son commentaire, l'approche de GMan fonctionnerait, mais vous aurez besoin de le stocker dans une mémoire tampon afin d'imprimer dans l'ordre correct (son algorithme imprimerait « 6 5 4 3 2 1 "pour l'entrée 123456). À ce stade, je dirais que ce serait beaucoup plus simple à utiliser juste sprintf comme « therefromhere » proposé dans sa réponse (si ce n'est pas une affectation de classe d'algorithme bien sûr).

A mon avis, la façon la plus simple de le faire serait d'utiliser récursion, de cette façon, vous pouvez imprimer les chiffres dans le bon ordre sans utiliser des tampons.

La mise en œuvre récursive est très 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;
}

Entrée:

  

-78900456

Sortie:

- 7 8 9 0 0 4 5 6

EDIT : Merci à Steve Jessop qui a proposé un algorithme correct pour les entiers positifs pendant mon absence. J'ai changé la méthode ci-dessus pour imprimer correctement pour tous les ints (positives et négatives), sans le dernier espace.

S'il vous plaît noter que nous pouvons éviter de vérifier des valeurs négatives dans chaque récursion, en faisant le chèque une fois (dans la fonction principale ou ailleurs), mais je n'ai pas écrit parce que nous perdrions plus sur la clarté de gain en performance.

Autres conseils

La façon la plus simple de le faire (mais pas le plus rapide) serait probablement d'abord sprintf le numéro à un tampon de chaîne, et ensuite à travers la boucle tampon printf - ing un caractère et un espace à la fois.

Il n'y a pas moyen intégré de faire cela dans la mise en forme standard printf.

Une méthode commune serait d'extraire chaque chiffre, puis imprimer ce chiffre. Je ne vais pas vous donner le code, mais il est la version mise en œuvre 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 */

Ce sera en arrière. Je vais laisser comme un exercice pour vous de corriger cela. (Astuce: Dans la boucle, mettre le résultat dans un tableau de caractères, et lorsque vous avez terminé début au dernier indice du tableau et d'impression en arrière.)


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

Cela ne fonctionne que pour les entiers non signés:

#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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top