Un enfoque posible:
#include <stdio.h>
char *digits[10] = {
"Zero", "One", "Two", "Three", "Four",
"Five", "Six", "Seven", "Eight", "Nine"
};
int main() {
int num, digit;
long long tenth = 1;
printf("Please enter an integer: \n");
scanf("%d", &num);
while (tenth < num) {
tenth *= 10;
}
while (tenth > 1) {
tenth /= 10;
digit = num / tenth;
num %= tenth;
printf("%s ", digits[digit]);
}
return 0;
}
Manifestación. Ahora para explicaciones:
En primer lugar, tiene poco sentido usar switch
Aquí: los dígitos son bastante lineales por su naturaleza, por lo tanto, sus nombres pueden (y deben) almacenarse en una variedad de cuerdas (en su lugar (char *digits[10]
en este código). Entonces podrá obtener una etiqueta para un dígito en particular simplemente accediendo a esta matriz usando este dígito como índice.
En segundo lugar, el problema clave de este programa es extraer cada dígito de la entrada por separado. Es más fácil de hacer de derecha a izquierda (tome el resultado de number % 10
, asignar number / 10
a number
, repita), pero aquí se deben hacer las cosas de otra manera, de izquierda a derecha. Entonces esto es lo que hacemos:
- calcular
tenth
- El primer poder de 10 que es más grande que el número dado (por ejemplo, si trabajamos con 546, eso será 1000)
- En cada iteración posterior:
-- dividir tenth
por 10
- procesar el resultado de la división entera de number
por tenth
- Asignar de nuevo a number
el resto de number
dividido por tenth
En la primera iteración tenth
Se convierte en 100 (1000/10), 546/100 le da 5 (un entero dividido por entero es entero, los decimales se truncan), 546 % 100 le da 46, que se almacena como un número para la segunda iteración.
En la segunda iteración tenth
se convierte en 10 (100/10), 46/10 le da 4, 46 % 10 le da 6. Siguiente ciclo: 10/10 => 1, 6/1 => 6, 6 % 1 => 0. Entonces tenth
se ha vuelto igual a 1, y el bucle se detiene, ya que todos los dígitos se procesan.