Inserimento di spazi tra le cifre in C
-
21-09-2019 - |
Domanda
Come potrei prendere un numero come 123456
e averlo stampato come 1 2 3 4 5 6
?
Soluzione
Come ha menzionato 'jamesdlin' nel suo commento, l'approccio di GMan funzionerebbe, tuttavia dovrai memorizzarlo in un buffer per poterlo stampare nell'ordine corretto (il suo algoritmo stamperebbe "6 5 4 3 2 1" per l'input 123456).A questo punto direi che sarebbe molto più semplice usare semplicemente sprintf come suggerito da "thefromhere" nella sua risposta (se questo non è un incarico di classe di algoritmo ovviamente).
Secondo me il modo più semplice per farlo sarebbe usare la ricorsione, in questo modo puoi stampare le cifre nell'ordine giusto senza utilizzare buffer.
L'implementazione ricorsiva è molto semplice:
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;
}
Ingresso:
-78900456
Produzione:
- 7 8 9 0 0 4 5 6
MODIFICARE:Grazie a Steve Jessop che mentre ero via ha suggerito un algoritmo corretto per gli interi positivi.Ho modificato il metodo precedente per stampare correttamente tutti gli interi (positivi e negativi), senza l'ultimo spazio.
Tieni presente che possiamo evitare di verificare la presenza di valori negativi in ogni ricorsione, eseguendo il controllo solo una volta (nella funzione principale o dovunque) ma non l'ho scritto perché perderemmo più in chiarezza che guadagno in prestazioni.
Altri suggerimenti
Un metodo comune sarebbe quello di estrarre ogni cifra, e quindi stampare quella cifra. Io non ti darò il codice, ma è la versione implementata di:
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 */
Questa sarà all'indietro. Lascio come esercizio a voi per sistemare le cose. (Suggerimento: Nel ciclo, mettere il risultato in un array di caratteri, e quando hai finito inizio all'ultimo indice della matrice e di stampa all'indietro.)
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++]);
Questo funziona solo per numeri interi senza segno:
#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;
}