<div dir="ltr">Hola User,<div class="gmail_extra"><br><div class="gmail_quote">2013/6/7 User <span dir="ltr"><<a href="mailto:usuarioanonimomysql@gmail.com" target="_blank">usuarioanonimomysql@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Hola,<div><br></div><div>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><br></div><div>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><br></div><div>Me gustaría proponer el reto de que alguien lo mejore haciendo que sea más rápido. El código:</div>
</div></blockquote><div><br></div><div style>Bueno, tal y como comentas en tu código fuente, lo que realmente hace es que "descompone el número introducido". En matemáticas, esto implica que quieres descomponer en factores (o factorizar). Esto significa que deberías determinar los factores primos. Por ejemplo,</div>
<div style><br></div><div style>21952 ÷ 2<br></div><div style>10976 ÷ 2<br></div><div style>5488 ÷ 2<br></div><div style>2744 ÷ 2</div><div style>1372 ÷ 2<br></div><div style>686 ÷ 2<br></div><div style>343 ÷ 7<br></div><div style>
49 ÷ 7<br></div><div style>7 ÷ 7<br></div><div style>1</div><div style><br></div><div style>Así que,</div><div style><br></div><div style>21952 = 2^6 * 7^3 = 4^3 * 7^3 = 28^3</div><div style><br></div><div style>Habría que comprobar si algunos factores comunes se pueden reescribir para obtener una base común y así determinar el exponente. Es decir, el programa debería comprobar si se puede reescribir 2^6 para que sea 4^3, porque tenemos un 7^3. Esto supone que tenemos dos bases diferentes pero con el mismo exponente; así que, 4^3 * 7^3 = (4*7)^3 = 28^3. Ahora tenemos la base común, 28, y el exponente, 3.</div>
<div><br></div><div><br></div><div style>Si no te gusta la solución anterior - y prefieres usar la tuya - entonces, sugiero mejorar el algoritmo de '<span style="font-family:arial,sans-serif;font-size:12.727272033691406px">eleva()'. En lugar de basarse en multiplicar la base tantas veces por sí misma, multiplica la base cuadrada. Esto implica que el exponente se basa en 2 y por tanto, podemos tratar el exponente como una secuencia binaria: 0 implica que no pertenece al resultado final y 1 indica que sí. Por ejemplo,</span></div>
<div style><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></span></div><div style><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">28^3<br>------</span></div><div style>
<span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br>base <-- 28</span></div><div style><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">exponente <-- 3<br></span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br>
</span></div><div style><div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">resultado <-- 1</span></div><div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></span></div>
</div><div style><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">bucle: exponente > 0</span></div><div style><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">   Si </span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">exponente </span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">AND 1 != 0, entonces</span></div>
<div style><div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">       </span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">resultado</span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"> <-- </span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">resultado</span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"> * </span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">base</span></div>
<div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></span></div></div><div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">   base <-- base * base</span></div><div style>
<span style="font-family:arial,sans-serif;font-size:12.727272033691406px">   exponente <-- exponente SHR 1</span><br></div><div style><br></div><div style>Terminar( resultado )</div><div style><br></div><div style><br>
</div><div style>Aquí AND es la operación AND a nivel de bits (& en C/C++) y SHR es el desplazamiento a la derecha de una secuencia binaria (>> en C/C++).</div><div style><br></div><div style>Lo que hacemos es convertir el exponente en binario y miramos los bits para acumular el resultado (AND da 1) o no (AND da 0). Por ejemplo,</div>
<div style><br></div><div style>3 => 11 (binario)</div><div style><br></div><div style>base <-- 28<br>11 AND 01 != 0  // => 01 != 0<br>resultado <-- 28</div><div style><br></div><div style>base <-- 784  // 28^2</div>
<div style>exponente <-- 1  // 11 SHR 1 = 1</div><div style><br></div><div style><div>1 AND 1 != 0  // => 1 != 0<br><div>resultado <-- 21952  // 28 * 784</div><div><br></div><div>base <-- 614656  // 28^4</div>
<div>exponente <-- 0  // 1 SHR 1 = 0</div></div><div><br></div><div style>Terminar( 21952 )</div></div><div style><br></div><div style><br></div><div style>Espero que esto te ayude.</div><div style><br></div><div style>
Steven</div><div style><br></div></div></div></div>