2012-02-15 1399 views
19

Digamos que tengo un entero de varios dígitos en C. Quiero dividirlo en enteros de un solo dígito.C: ¿cómo separar un número de varios dígitos en variables separadas?

123 se convertirían en 1, 2 y 3.

¿Cómo puedo hacer esto, especialmente si no sé cuántos dígitos tiene el número entero?

+0

División y resto. –

+0

Dígitos decimales significa '% 10'. –

+2

Si su int comenzó su vida como 'datos char' (entrada de usuario o archivo de texto ...) no convierta a int en primer lugar (no' scanf', no 'atoi' ...) y use los caracteres para separa los dígitos – pmg

Respuesta

27
int value = 123; 
while (value > 0) { 
int digit = value % 10; 
// do something with digit 
value /= 10; 
} 
+5

este algoritmo emite dígitos en orden inverso ... – Matze

2

Como sugerencia, obtener el enésimo dígito del número es bastante fácil; divida por 10 n veces, entonces mod 10, o en C:

int nthdig(int n, int k){ 
    while(n--) 
     k/=10; 
    return k%10; 
} 
+0

esto no es n-ésimo dígito, este es n-ésimo dígito empezando por el menos significativo –

+0

¿No considera que el dígito menos significativo es el zeroth? – Dave

+3

bueno, considero que los dígitos primero o cero de 123 son 1, no 3. –

0

Los últimos dígitos del 123 es 123% 10. Puede dejar caer el último dígito del 123 al hacer 123/10 - usando la división de enteros esto le dará 12. Para responder a su pregunta sobre "cómo sé cuántos dígitos tiene" - intente hacerlo como se describe arriba y verá cómo saber cuándo detenerse.

5

En primer lugar, contar los dígitos:

unsigned int count(unsigned int i) { 
unsigned int ret=1; 
while (i/=10) ret++; 
return ret; 
} 

A continuación, puede almacenarlos en una matriz:

unsigned int num=123; //for example 
unsigned int dig=count(num); 
char arr[dig]; 
while (dig--) { 
arr[dig]=num%10; 
num/=10; 
} 
+1

Mejor ejemplo que la respuesta actual, gracias – moffeltje

0

creo que a continuación pieza de código ayudará ....

temp = num; 
while(temp) 
{ 
    temp=temp/10; 
    factor = factor*10; 
} 

printf("\n%d\n", factor); 
printf("Each digits of given number are:\n"); 

while(factor>1) 
{ 
    factor = factor/10; 
    printf("%d\t",num/factor); 
    i++; 
    num = num % factor; 
} 
0

Pruebe este código si desea separar dígitos en el mismo orden sin utilizar matrices.

//Separate number digits 
#include <stdio.h> 
#include <math.h> 

void main() 
{ 
    int x, y, n = 0; 

    scanf("%d", &x); 

    //counting digits 
    y = x; 
    while (y != 0) 
    { 
     n += 1; 
     y /= 10; 
    } 

    //printing separated digits 
    int i; 
    for (i = ceil(pow(10, (n - 1))); i != 0; i /= 10) 
     printf("%d ", (x/i) % 10); 
} 
0

podemos utilizar este programa como una función con 3 arguments.Here en "tiempo (a ++ < 2)", 2 es el número de dígitos que necesita (se puede dar como un argumento) reemplazar a 2 con ninguna de las dígitos que necesitas Aquí podemos usar "z/= pow (10,6)" si no necesitamos los últimos dígitos, reemplace 6 por el no de dígitos que no necesita (puede dar como otro argumento), y el tercer argumento es el número que necesitas para romper

int main(){ 
long signed c=0,z,a=0,b=1,d=1; 
scanf("%ld",&z); 
while(a++<2){ 
     if(d++==1) 
     z/=pow(10,6); 
     c+=(z%10)*b; 
     z/=10; 
     b*=10;} 
     return c;} 
0
//Based on Tony's answer 
#include <stdio.h> 
int nthdig(int n, int k){ 
    while(n--) 
     k/=10; 
    return k%10; 
} 

int main() { 
    int numberToSplit = 987; 
    printf("Hundreds = %i\n",nthdig(2, numberToSplit)); 
    printf("Tens  = %i\n",nthdig(1, numberToSplit)); 
    printf("Units = %i\n",nthdig(0, numberToSplit)); 
} 

Esto se traduce en la siguiente impresión:

Cientos = 9

Decenas = 8

Unidades = 7

0

Hice esta basado en el código de @asaelr:

typedef struct digitsArrayPlusNumber { 
    uint32_t *baseAddress; 
    uint32_t number; 
} digitsArrayPlusNumber; 

digitsArrayPlusNumber *splitDigits (uint32_t inValue) { 
    // based on code from [email protected] 

    uint32_t inputValue = inValue; 

    //Count digits 

    uint32_t theCount = 1; 
    while (inputValue /= 10) 
     theCount++; 

    // put in array 
    uint32_t *arr = malloc(sizeof(uint32_t) * theCount); 
    uint32_t dig = theCount; 
    while (dig--) { 
     arr[dig]=inValue % 10; 
     inValue /= 10; 
     // printf ("%d\n", arr[dig]); 
    } 

    digitsArrayPlusNumber *dandn = malloc (sizeof(digitsArrayPlusNumber)); 

    dandn->baseAddress = arr; 
    dandn->number = theCount; 

    return dandn; 

} 

int main(int argc, const char * argv[]) { 


    for (int d = 0; d < splitDigits(12345678)->number; d++) 
     printf ("%u\n", (splitDigits(12345678)->baseAddress)[d]); 

} 

Funciona bastante bien, gracias!

-1

Puede dividir y conquistar pero ha reescrito todas las bibliotecas aritméticas. Sugiero usar una biblioteca de precisión múltiple https://gmplib.org Pero, por supuesto, es una buena práctica

+0

Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente [reputación] (https://stackoverflow.com/help/whats-reputation) podrá [comentar cualquier publicación] (https://stackoverflow.com/help/privileges/comment); en su lugar, [brinde respuestas que no requieran aclaración del autor de la pregunta] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-instead). - [De la reseña] (/ review/low-quality-posts/17348132) – teppic

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la opinión] (/ reseña/mensajes de baja calidad/17348132) – primpap

0

Puede usar% 10, que significa el resto si el número después de dividirlo. Entonces 123 % 10 es 3, porque el resto es 3, resta el 3 de 123, luego es 120, luego divide 120 con 10 que es 12.Y haz el mismo proceso.

Cuestiones relacionadas