[C con Clase] Mejorar un algoritmo que calcula las combinaciones de base y exponente enteras para un número entero dado

User usuarioanonimomysql en gmail.com
Vie Jun 7 16:42:17 CEST 2013


Hola,

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.

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.

Me gustaría proponer el reto de que alguien lo mejore haciendo que sea más
rápido. El código:

#include <iostream>

#include <vector>
#include <cstdlib>
#include "math.h"

using namespace std;

// Clase para almacenar un resultado
class Resultado
{
public:
    Resultado(long long base, int exponente){m_base = base; m_exponente =
exponente;}

public:
    long long obtenerBase(){ return m_base;}
    int obtenerExponente(){ return m_exponente;}

private:
    long long m_base;
    int m_exponente;
};

// Función para elevar a la n-enesima potencia
long long eleva(long long base, int exponente, long long numeroCompuesto)
{
    long long resultado = base;
    for (int i = 1; i < exponente; i++)
    {
        resultado = resultado * base;
        if (resultado > numeroCompuesto)
            break;
    }
    return resultado;
}

int main()
{
    cout << "Introduzca un numero para proceder a su descomposicion en base
y exponente de numeros enteros: ";
    long long numeroCompuesto;
    cin >> numeroCompuesto;

    long long resultado = 0;
    std::vector<Resultado*> resultados;
    double porcentaje = 0.0;
    double dec, ent;
    // Descompone el número introducido en una combinación de números
enteros de base y exponente
    for (long long base = numeroCompuesto; base > 2; base--)
    {
        for (int exponente = 1; exponente < 5; exponente++)
        {
            resultado = eleva(base, exponente, numeroCompuesto);
            if (resultado == numeroCompuesto && 1 != exponente)
            {
                Resultado* resultado = new Resultado(base, exponente);
                resultados.push_back(resultado);
            }
        }
        porcentaje = (double)(base * 100) / (double)numeroCompuesto;
        dec = modf(porcentaje, &ent);

        // Imprime el progreso de ejecución
        if (0.0f == dec)
        {
            system("cls");
            cout << "Progreso de ejecucion: " << 100 - ent << "%" << endl;
        }
    }
    system("cls");
    cout << "Progreso de ejecucion: 100%" << endl;

    // Muestra resultados obtenidos
    if (resultados.size())
    {
        cout << "----------------" << endl;
        cout << "Lista de valores" << endl;
        cout << "----------------" << endl;
    }
    for (int i = 0; i < resultados.size(); i++)
    {
        cout << "base: " << resultados.at(i)->obtenerBase() << " exponente:
" << resultados.at(i)->obtenerExponente() << endl;
    }

    return 0;
}
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130607/e10a3a61/attachment.html>


Más información sobre la lista de distribución Cconclase