1

Hice un programa que descomponía un numero ingresado un arreglo siempre y cuando este fuera estático, es este:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
using namespace std;
int main(){
    int numero=0, arreglo[15]={0}, i=0, divisor=100000000, digito=0, sustraendo=0;
    //captura de un numero
    cout<<"\t\tNUMERO-ARREGLO\n\n";
    cout<<"teclea un numero=";
    cin>>numero;
    cout<<endl;
    //limpiar arreglo
    for(i=0; i<15; i++){
        arreglo[i]=0;
    }
    //obtener digitos
    for(i=0; i<9; i++){
        digito=numero/divisor;
        arreglo[i]=digito;
        sustraendo=digito*divisor;
        numero=numero-sustraendo;
        divisor=divisor/10;
    }
    //imprimir arreglo
    for(i=0; i<15; i++){
        cout<<arreglo[i]<<" ";
    }
    return 0;
}

Quería saber si se puede hacer esto de forma mas sencilla, es decir, ingresar el numero y poner cada elemento dentro del arreglo como con un strcpy si estuviera usando una cadena de caracteres ya que quería hacer este mismo programa pero con un arreglo dinámico.

Trauma
  • 25,297
  • 4
  • 37
  • 60
Saul Sanchez
  • 21
  • 1
  • 3

2 Answers2

1

Como puede ver verlo aqui, puedes hacerlo con la siguiente función:

#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;
}

Saludos!

Leonardo Cabré
  • 2,647
  • 4
  • 11
  • Dado el código propuesto por el OP, dudo que entienda que es el bucle `for` de rango y el uso de contenedores como `vector`. Deberías explicar más detalladamente el código. – Xam Oct 03 '18 at 04:13
1

Hice un programa que descomponía un numero ingresado un arreglo [...] Quería saber si se puede hacer esto de forma mas sencilla.

Si, el código podría ser mucho más sencillo, pero antes de compartir mi propuesta voy a señalar algunos detalles de tu código:

  • Las cabeceras <stdio.h> y <stdlib.h> son de no de . Estas cabeceras disponen de una versión adaptada a C++ que tiene el prefijo c y carece de extensión. Si realmente necesitas usar las cabeceras de C (que nunca será el caso) debes usar los equivalentes de C++ <cstdio> y <cstdlib> . Lee este hilo para saber por qué.
  • No hay obligación de usar la cláusula using namespace std; pues es sólo es una ayuda a la escritura de código; si decides usar esta cláusula no lo hagas en el ámbito global, úsala en el ámbito más pequeño posible. Lee este hilo para saber por qué.
  • No tienes que "limpiar tu arreglo" en un bucle ya que gracias a la inicialización que le aplicaste (arreglo[15]={0}) todos sus elementos ya son 0. Lee este hilo para saber por qué.
  • Evita abusar de std::endl (pues puede causar problemas de rendimiento) y favorece el uso del salto de línea explícito (\n). Lee este hilo para saber por qué.

Una vez dicho esto, te propongo:

Propuesta.

Para separar un número decimal en sus dígitos basta con obtener su residuo de dividir entre la base (en este caso base decimal):

// Mientras el número no sea 0, extrae sus dígitos:
while (numero)
{
    auto digito = numero % 10;
    std::cout << digito;
    numero /= 0;
}

El operador % devuelve el residuo de una división entera, así que 111 % 10 es 1, 42 % 10 es 2, 112357 % 111 es 25, etc...

El problema es que este algoritmo nos extrae los dígitos desde el menos significativo al más significativo (es decir: en orden inverso) tú lo has solucionado empezando por el divisor más grande que se te ha ocurrido (100000000), podemos solucionar este problema usando recursividad:

void digito_a_digito(int numero, int (&destino)[15], int &indice)
{
    if (numero)
    {
        digito_a_digito(numero / 10, destino, indice);
        destino[indice++] = numero % 10;
    }
}

Dado que la inserción del valor en destino se hace después de la llamada recursiva, la recursión parecerá hacerse a la inversa: En el índice 0 se pondrá el último dígito, en el 1 el penúltimo, etc... el parámetro destino es una referencia a un arreglo de 15 posiciones (que será donde guardemos el resultado) y el parámetro indice es el que nos indica en qué posición de destino debemos escribir, lo pasamos como referencia para que su valor pueda ser modificado en todas las llamadas, por lo tanto:

int main()
{
    int resultado[15] = {0};
    digito_a_digito(987654321, resultado);
    for (const auto &v : resultado) std::cout << v;
    return 0;
}

El código anterior muestra:

987654321000000

Puedes ver que hay varios ceros tras el último dígito, ya que el arreglo es de 15 posiciones y el número de 9 dígitos, cambiando ligeramente el programa lo arreglamos:

int main()
{
    using namespace std;

    // Captura de un numero
    int numero;
    cout << "\t\tNUMERO-ARREGLO\n\nteclea un numero=";
    cin >> numero;
    cout << '\n';

    int indice = 0, resultado[15] = {0};
    digito_a_digito(numero, resultado, indice);

    for (int indice = 0; numero; numero /= 10, ++indice)
        cout << resultado[indice];

    return 0;
}

En el bucle for del anterior código, ponemos el índice de nuevo a 0 y hacemos que la condición de finalización del bucle sea que el número leído sea diferente de 0, si vamos dividiendo por 10 en cada vuelta del bucle, el bucle dará tantas vueltas como dígitos (en base 10) tenga, en cada vuelta también incrementamos el índice para saber qué posición del arreglo imprimir.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82