2009-12-07 16 views
11

me gustaría convertir un entero en una matriz, para que se vea como la siguiente:Convertir entero en conjunto

int number = 123456 ; 
int array[7] ; 

con el resultado:

array[0] = 1 
array[1] = 2 
... 
array[6] = 6 
+5

¿Puede explicar lo que ya ha probado y por qué no funcionó? – catchmeifyoutry

+0

Es tarea, pero muerdo. Mi esposa realmente no entendió esto hasta que se lo expliqué. – Broam

+8

Algo sale mal en tu "...". Hay 7 miembros de la matriz, pero solo 6 dígitos decimales en el número. –

Respuesta

0

La forma más sencilla que puedo imaginar ahora es:

char array[40]; 
int number = 123456; 

memset(array, 0x00, sizeof(array)); 

sprintf(array, "%d", number); 

Además, puede convertir cada dígito a int simplemente restando el valor de char por 0x30.

EDIT: Si esto es una tarea, su profesor probablemente le pida que escriba el programa utilizando% operator though (ejemplo 12% 10 = 2). Si este es el caso, la buena tarea ;-)

+0

que es una matriz char, no una matriz int – catchmeifyoutry

+0

Si va a usar sprintf, al menos use snprintf – philsquared

+0

Sé que es una matriz char, pero puede convertir fácilmente a int restando el valor char 0x30, como observé en la respuesta. snprintf no es el estándar C – Andres

4

puede extraer el último dígito del número de esta manera:

int digit = number % 10; 
number /= 10; 

en cuenta que también debe comprobar si number es positivo. Otros valores requieren manejo adicional.

0

Puede usar el módulo para determinar el último dígito.

Y puede usar la división para mover otro dígito a la posición del último dígito.

8

sólo tiene que utilizar la aritmética modular:

int array[6]; 
int number = 123456; 
for (int i = 5; i >= 0; i--) { 
    array[i] = number % 10; 
    number /= 10; 
} 
+4

¿Qué tal una respuesta que realmente explique el enfoque para que el OP * aprenda * algo? – jalf

+0

También está codificado para tratar con números de 6 dígitos – philsquared

+0

Eso solo funcionará correctamente en enteros de 6 dígitos no negativos. –

22

Tal vez una mejor solución es trabajar hacia atrás:

123456 % 10 = 6

123456/10 = 12345

12345 % 10 = 5

12345/10 = 1234

1

Tome el log10 del número para obtener el número de dígitos. Pon eso, digamos pos, luego, en un bucle, toma el módulo de 10 (n % 10), coloca el resultado en la matriz en la posición pos. Decrete pos y divida el número por 10. Repita hasta pos == 0

¿Qué desea hacer con el letrero si es negativo?

0

No puede simplemente "convertirlo". El número entero no se representa en software en notación decimal. Por lo tanto, los dígitos individuales que desea no existen. Ellos tienen que ser calculados.

Entonces, dado un número arbitrario, ¿cómo se puede determinar el número de unidades?

Podríamos dividir por diez, y luego tomar el resto: Para 123, la división daría 12, y luego hay un resto de 3. Así que tenemos 3 unos. El 12 nos dice lo que tenemos más allá de los que están, por lo que puede ser nuestra entrada para la próxima iteración. Tomamos eso, dividimos por 10, obtenemos 1 y un resto de 2. Entonces tenemos 2 en el lugar de las decenas, y 1 restante para trabajar por cientos. Divida eso por 10, lo que nos da cero, y un resto de 1.Así que obtenemos 1 en el lugar de las centenas, 2 en el lugar de las decenas y 3 en el lugar de las unidades. Y hemos terminado, ya que la última división regresó a cero.

0

si esto es realmente la tarea a continuación, muestran que su profesor - sólo por diversión ;-)

PRECAUCIÓN! un rendimiento muy pobre, torpe manera de alcanzar el efecto que espera y por lo general no hacer esto en casa (trabajo) ;-)

#include <algorithm> 
#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 

typedef std::vector<int> ints_t; 

struct digit2int 
{ 
    int operator()(const char chr) const 
    { 
     const int result = chr - '0'; 
     return result; 
    } 
}; 

void foo(const int number, ints_t* result) 
{ 
    std::ostringstream os; 
    os << number; 
    const std::string& numberStr = os.str(); 
    std::transform(
     numberStr.begin(), 
     numberStr.end(), 
     std::back_inserter(*result), 
     digit2int()); 
} 

int main() 
{ 
    ints_t array; 
    foo(123456, &array); 
    std::copy(
     array.begin(), 
     array.end(), 
     std::ostream_iterator<int>(std::cout, "\n")); 
} 
0

Si quería convertirlo en una cadena, entonces sería muy fácil, acaba de hacer lo que todo el mundo está diciendo sobre cómo utilizar el operador%:

Digamos num = 123, podemos hacer esto:

string str; 
while (num > 0) 
{ 
    str = (num % 10) + str; //put last digit and put it into the beginning of the string 
    num = num /10; //strip out the last digit 
} 

Ahora puede utilizar str como una matriz de caracteres. Hacer esto con una matriz es una molestia porque poner cosas al comienzo de una matriz requiere que cambies todo lo demás. Lo que podemos hacer es, en lugar de poner cada dígito en una cadena, podemos ponerlo en una pila. Lo pondrá en un orden inverso al siguiente: 3 2 1. Luego, podemos abrir el número superior uno por uno y ponerlo en una matriz en el orden correcto. Tu matriz se verá así: 1 2 3. Dejaré la implementación para ti porque es tarea.

@Broam tiene una buena solución, pero como dijo, es para trabajar hacia atrás. Creo que el OP o quien venga buscando este hilo lo querrán y es por eso que estoy publicando esto. Si tiene una mejor solución, responda, también estoy interesado.

2

Aquí lo que se me ocurrió, la función integerToArray devuelve un vector que se convierte a partir del valor entero. también puede probarlo con la función principal:

#include <iostream> 
#include <vector> 
using namespace std; 

vector <int> integerToArray(int x) 
{ 
    vector <int> resultArray; 
    while (true) 
    { 
    resultArray.insert(resultArray.begin(), x%10); 
    x /= 10; 
    if(x == 0) 
     return resultArray; 
    } 
} 

int main() 
{ 
    vector <int> temp = integerToArray(1234567); 
    for (auto const &element : temp) 
     cout << element << " " ; 
    return 0; 
} 

//outputs 1 2 3 4 5 6 7