<div dir="ltr">Hola,<div><br></div><div style>He hecho un código que dado un número entero, obtiene las combinaciones de base y exponente enteras que existen para ese número. Por ejemplo si introducís el número 21952 obtendréis los números de base y exponente 28 y 3 respectivamente.</div>
<div style><br></div><div style>Como se puede ver en el código, el exponente está limitado a 4 con lo que no encontrará combinaciones de base y exponente con un exponente mayor a 4.</div><div style><br></div><div style>Me gustaría proponer el reto de que alguien lo mejore haciendo que sea más rápido. El código:</div>
<div style><br></div><div style><div>#include <iostream></div><div><br></div><div>#include <vector></div><div>#include <cstdlib></div><div>#include "math.h"</div><div><br></div><div>using namespace std;</div>
<div><br></div><div>// Clase para almacenar un resultado</div><div>class Resultado</div><div>{</div><div>public:</div><div>    Resultado(long long base, int exponente){m_base = base; m_exponente = exponente;}</div><div><br>
</div><div>public:</div><div>    long long obtenerBase(){ return m_base;}</div><div>    int obtenerExponente(){ return m_exponente;}</div><div><br></div><div>private:</div><div>    long long m_base;</div><div>    int m_exponente;</div>
<div>};</div><div><br></div><div>// Función para elevar a la n-enesima potencia</div><div>long long eleva(long long base, int exponente, long long numeroCompuesto)</div><div>{</div><div>    long long resultado = base;</div>
<div>    for (int i = 1; i < exponente; i++)</div><div>    {</div><div>        resultado = resultado * base;</div><div>        if (resultado > numeroCompuesto)</div><div>            break;</div><div>    }</div><div>
    return resultado;</div><div>}</div><div><br></div><div>int main()</div><div>{</div><div>    cout << "Introduzca un numero para proceder a su descomposicion en base y exponente de numeros enteros: ";</div>
<div>    long long numeroCompuesto;</div><div>    cin >> numeroCompuesto;</div><div><br></div><div>    long long resultado = 0;</div><div>    std::vector<Resultado*> resultados;</div><div>    double porcentaje = 0.0;</div>
<div>    double dec, ent;</div><div>    // Descompone el número introducido en una combinación de números enteros de base y exponente</div><div>    for (long long base = numeroCompuesto; base > 2; base--)</div><div>    {</div>
<div>        for (int exponente = 1; exponente < 5; exponente++)</div><div>        {</div><div>            resultado = eleva(base, exponente, numeroCompuesto);</div><div>            if (resultado == numeroCompuesto && 1 != exponente)</div>
<div>            {</div><div>                Resultado* resultado = new Resultado(base, exponente);</div><div>                resultados.push_back(resultado);</div><div>            }</div><div>        }</div><div>        porcentaje = (double)(base * 100) / (double)numeroCompuesto;</div>
<div>        dec = modf(porcentaje, &ent);</div><div><br></div><div>        // Imprime el progreso de ejecución</div><div>        if (0.0f == dec)</div><div>        {</div><div>            system("cls");</div>
<div>            cout << "Progreso de ejecucion: " << 100 - ent << "%" << endl;</div><div>        }</div><div>    }</div><div>    system("cls");</div><div>    cout << "Progreso de ejecucion: 100%" << endl;</div>
<div><br></div><div>    // Muestra resultados obtenidos</div><div>    if (resultados.size())</div><div>    {</div><div>        cout << "----------------" << endl;</div><div>        cout << "Lista de valores" << endl;</div>
<div>        cout << "----------------" << endl;</div><div>    }</div><div>    for (int i = 0; i < resultados.size(); i++)</div><div>    {</div><div>        cout << "base: " << <a href="http://resultados.at">resultados.at</a>(i)->obtenerBase() << " exponente: " << <a href="http://resultados.at">resultados.at</a>(i)->obtenerExponente() << endl;</div>
<div>    }</div><div><br></div><div>    return 0;</div><div>}</div></div></div>