<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>