¿Cómo obtener diferentes dígitos a partir del dígito más significativo en un número en c?

Estoy resolviendo un problema en el que se da un entero positivo y tengo que mostrarlo en palabras.

Por ejemplo, si un número es 2134 la salida debería ser "two one three four" . Si utilizo el operador de módulo y uso la técnica de recursión, obtengo los dígitos que comienzan con el dígito menos significativo, es decir, "four three one two"

También puedo invertir el número y luego usar el operador de módulo, pero estoy buscando un método mejor.

¿Cuál puede ser un mejor enfoque para resolver este problema? ¿Qué concepto me falta?

Mi respuesta simple:

 void printNum(int x) { static const char * const num[] = { "zero ", "one ", "two " , "three ", "four ", "five ", "six ", "seven ", "eight ", "nine " }; if (x < 10) { printf(num[x]); return; } printNum(x / 10); printNum(x % 10); } 

editar

Después de un poco más de experimentación y ajustes, se me ocurrió esta versión. Creo que esta es la función recursiva más "pura" que puedo hacer.

 void printNum(int x) { static const char * const num[] = {"zero ", "one ", "two ", "three ", "four ", "five ", "six ", "seven ", "eight ", "nine "}; (x < 10)? printf(num[x]) : (printNum(x / 10), printNum(x % 10)); } 

En caso de que estés buscando una solución recursiva:

 void num2word(int n) { if (n / 10 == 0) { // print the word for n } else { num2word(n / 10); // print the word for n % 10 } } 

Ir por una respuesta matemática pura, porque creo que eso es lo que estás buscando:

 #include  #include  main() { long long mynum = 2987612345; long long firstDigitValue; int firstDigit; char *names[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; while (mynum > 0) { firstDigit = (int) (mynum/pow(10,(int)log10(mynum))); firstDigitValue = firstDigit * pow(10,(int)log10(mynum)); mynum -= firstDigitValue; printf("%s ", names[firstDigit]); } printf("\n"); } 

Y luego ejecutarlo produce:

 two nine eight seven six one two three four five 

Debería funcionar con cualquier número de tamaño que un largo puede manejar (en otros idiomas, o con una biblioteca de números grandes en C, puede manejar algo arbitrariamente grande).

Ahora … no estoy seguro de que el uso de log10 y pow sea el más rápido. Pero es lo más divertido 🙂

Si es un char * terminado en nulo, entonces ¿por qué no hacer esto?

 int i = 0; while(char[i] != null){ switch(char[i]): case '1': printf("One "); break; .... i++; } 

si no es un char *, conviértalo en uno con char * temp = itoa (número);

 1234 / 1000 => 1 1234 % 1000 => 234 234 / 100 => 2 1234 % 100 => 34 34 / 10 => 3 1234 % 10 => 4 

Puede crear fácilmente un bucle alrededor de eso, pero puede ir incluso más fácil con itoa, sprintf y std :: to_string .