[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