Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Algoritmo potencia

Estas en el tema de Algoritmo potencia en el foro de C/C++ en Foros del Web. Buenas, tal vez os parezca algo tonto, pero necesito un algoritmo para potencia que no sea por recursividad, ni usando bucle, ni la función pow... ...
  #1 (permalink)  
Antiguo 21/10/2014, 16:32
 
Fecha de Ingreso: octubre-2014
Mensajes: 13
Antigüedad: 10 años, 1 mes
Puntos: 0
Algoritmo potencia

Buenas, tal vez os parezca algo tonto, pero necesito un algoritmo para potencia que no sea por recursividad, ni usando bucle, ni la función pow... sé que puede sonar extraño, ¿pero a alguien con imaginación se le ocurre algo?
Saludos!
  #2 (permalink)  
Antiguo 21/10/2014, 22:54
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Algoritmo potencia

Código C++:
Ver original
  1. double b = 2;
  2. int n = 3;
  3. // b ^ n = 2 ^ 3 = 8
  4. std::cout << b << " elevado a la " << n << " es " << std::exp(n*std::log(b)) << std::endl;
Lareto :)
  #3 (permalink)  
Antiguo 21/10/2014, 23:51
 
Fecha de Ingreso: octubre-2014
Mensajes: 13
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Algoritmo potencia

Perfecto, muchas gracias Lareto :)
Eso sí, no puedo usar esas funciones tampoco , ¿sabes como podría hacer a mano una función que haga el logaritmo?
  #4 (permalink)  
Antiguo 22/10/2014, 00:30
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Algoritmo potencia

Código C:
Ver original
  1. int pow(int base, int exp)
  2. {
  3.     int result = 1;
  4.     while (exp)
  5.     {
  6.         if (exp & 1)
  7.             result *= base;
  8.         exp >>= 1;
  9.         base *= base;
  10.     }
  11.  
  12.     return result;
  13. }

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 22/10/2014, 06:18
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 12 años, 4 meses
Puntos: 22
Respuesta: Algoritmo potencia

Hola.

Mas opciones.

Iterativo:
Código C++:
Ver original
  1. int pow(int b, int e)
  2. {
  3.   int r = 1;
  4.   for(; e; e--) r *= b;
  5.   return r;
  6. }

Recursivo:
Código C++:
Ver original
  1. int pow(int b, int e)
  2. {
  3.   if (e == 0) return 1;
  4.   return b * pow(b, e-1);
  5. }

Saludos.
  #6 (permalink)  
Antiguo 22/10/2014, 07:25
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Algoritmo potencia

Vuestras soluciones tienen TODAS bucles... volviendo al tema... puedes optar por la nada elegante solución de usar goto... técnicamente no es un bucle, por lo que debería funcionar:

Código C:
Ver original
  1. int main( )
  2. {
  3.   int numero = 2;
  4.   int potencia = 5;
  5.   int resultado = numero;
  6.  
  7.   salto:
  8.   if ( potencia > 1 )
  9.   {
  10.     resultado *= numero;
  11.     potencia--;
  12.     goto salto;
  13.   }
  14.  
  15.   printf("Resultado: %d\n", resultado );
  16. }

Otra opción... válida únicamente en C++ sería usar templates... esta última solución solo te vale si los valores de la base y el exponente están predefinidos en el código:

Código C++:
Ver original
  1. template <int BASE, int POTENCIA>
  2. struct Potencia
  3. {
  4.     enum { value = BASE * Potencia<BASE, POTENCIA- 1>::value };
  5. };
  6.  
  7. template <int BASE>
  8. struct Potencia<BASE, 1>
  9. {
  10.     enum { value = BASE};
  11. };
  12.  
  13. template <int BASE>
  14. struct Potencia<BASE, 0>
  15. {
  16.     enum { value = 1};
  17. };
  18.  
  19. int main( )
  20. {
  21.   std::cout << Potencia<2, 5>::value;
  22. }

Última edición por eferion; 22/10/2014 a las 07:33
  #7 (permalink)  
Antiguo 22/10/2014, 07:40
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Algoritmo potencia

No habia visto lo de bucles.

Pues si es sin bucles ni funciones... a mi me parece mas una broma que un ejercicio.

Usar goto es usar un bucle. Los bucles c se traducen a instrucciones goto (goto, jmp, jump, etc) de assembler.
http://assembly.ynh.io/

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #8 (permalink)  
Antiguo 22/10/2014, 07:47
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Algoritmo potencia

Cita:
Iniciado por Profesor_Falken Ver Mensaje
No habia visto lo de bucles.
Pues si es sin bucles ni funciones... a mi me parece mas una broma que un ejercicio.
Yo he pensado lo mismo.

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Usar goto es usar un bucle. Los bucles c se traducen a instrucciones goto (goto, jmp, jump, etc) de assembler.
Lo se, pero un goto a secas no es un bucle, técnicamente es un salto... hacia atrás pero un salto.... el siguiente código dudo mucho que se pudiese interpretar como una sucesión de bucles:

Código C++:
Ver original
  1. int main( )
  2. {
  3.   goto a;
  4.   f: std::cout << "M"; goto g;
  5.   g: std::cout << "U"; goto h;
  6.   a: std::cout << "H"; goto b;
  7.   h: std::cout << "N"; goto i;
  8.   d: std::cout << "A"; goto e;
  9.   i: std::cout << "D"; goto j;
  10.   e: std::cout << " "; goto f;
  11.   c: std::cout << "L"; goto d;
  12.   j: std::cout << "O"; goto k;
  13.   b: std::cout << "O"; goto c;
  14.   k: std::cout << std::endl; return 0;
  15. }
  #9 (permalink)  
Antiguo 22/10/2014, 09:17
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Algoritmo potencia

...es que por poco no dice que hay que programar sin usar lenguaje de programación >_<. Justo pensé en el goto pero vaya a causar una tormenta de malas practicas jaja.
  #10 (permalink)  
Antiguo 22/10/2014, 09:22
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Algoritmo potencia

Cita:
Iniciado por vangodp Ver Mensaje
...es que por poco no dice que hay que programar sin usar lenguaje de programación >_<. Justo pensé en el goto pero vaya a causar una tormenta de malas practicas jaja.
Muy cierto... el goto, salvo para determinadas optimizaciones en entornos críticos no creo que sea necesario su uso...
* ¿Es una palabra reservada del lenguaje? cierto
* ¿Se puede usar si a uno le apetece? cierto
* ¿Es necesario su uso? en absoluto
* ¿Es recomendable su uso? en absoluto
  #11 (permalink)  
Antiguo 22/10/2014, 11:01
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Algoritmo potencia

Y a mi que me da que lo que realmente busca es calcular las potencias de 2 y en ese caso podemos usar desplazamientos:

Código C++:
Ver original
  1. std::cout << ( 2 << 4 ) << std::endl ;


Si no es eso me suena a pitorreo .

¡¡¡Saluditos!!!

  #12 (permalink)  
Antiguo 22/10/2014, 16:51
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Algoritmo potencia

Cita:
Iniciado por leosansan Ver Mensaje
Y a mi que me da que lo que realmente busca es calcular las potencias de 2 y en ese caso podemos usar desplazamientos:

Código C++:
Ver original
  1. std::cout << ( 2 << 4 ) << std::endl ;


Si no es eso me suena a pitorreo .

¡¡¡Saluditos!!!

Eso que es? 2elevado a 4?



Cita:
* ¿Es una palabra reservada del lenguaje? cierto
* ¿Se puede usar si a uno le apetece? cierto
* ¿Es necesario su uso? en absoluto
* ¿Es recomendable su uso? en absoluto
No se donde leí una vez que ciertas cosas solo existen por retro compatibilidad con programas antiguos, y que no se aconseja usar mas. Aun que como bien dices ahí siguen y se pueden usar. XDD

  #13 (permalink)  
Antiguo 23/10/2014, 03:45
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Algoritmo potencia

Cita:
Iniciado por leosansan Ver Mensaje
Si no es eso me suena a pitorreo .
¿No te gustó mi forma de calcularlo por templates?
  #14 (permalink)  
Antiguo 23/10/2014, 05:37
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Algoritmo potencia

Cita:
Iniciado por eferion Ver Mensaje
¿No te gustó mi forma de calcularlo por templates?
No sé por qué será pero me suena a función recursiva, bien disfrazada por cierto .

Un fuerte saludo eferion.

¡¡¡Saluditos!!!

  #15 (permalink)  
Antiguo 23/10/2014, 05:45
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Algoritmo potencia

Cita:
Iniciado por leosansan Ver Mensaje
No sé por qué será pero me suena a función recursiva, bien disfrazada por cierto .
Ese template no es recursivo... el valor de la potencia en ese template lo calcula directamente el compilador, en tiempo de ejecución no hay que calcular nada... la ventaja es que el tiempo de ejecución en este caso es nula y la desventaja es que los valores tienen que estar definidos en el código.

Un saludo para tí también leosansan
  #16 (permalink)  
Antiguo 23/10/2014, 11:29
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Algoritmo potencia

Cita:
Iniciado por eferion Ver Mensaje
Ese template no es recursivo... el valor de la potencia en ese template lo calcula directamente el compilador, en tiempo de ejecución no hay que calcular nada... la ventaja es que el tiempo de ejecución en este caso es nula y la desventaja es que los valores tienen que estar definidos en el código.
Si la "trampa" se calcula en tiempo de compilación... ¿es válido?. Entonces aquí va mi supermacro C

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define POW(B, E) pow(B, E)
  5.  
  6. int main() {
  7.     printf("%d", (int)POW(2 ,5));
  8.    
  9.     return 0;
  10. }

EDITO: ay no, me equivoqué!, la macro se expande y se ejecuta la función en runtime! Que tontaina soy...


Un saludo a todos
__________________
If to err is human, then programmers are the most human of us

Última edición por Profesor_Falken; 23/10/2014 a las 11:34
  #17 (permalink)  
Antiguo 23/10/2014, 12:41
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Algoritmo potencia

Buen intento pero no se puede usar pow .......

¡¡¡Saluditos!!!

  #18 (permalink)  
Antiguo 23/10/2014, 14:08
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Algoritmo potencia

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Si la "trampa" se calcula en tiempo de compilación... ¿es válido?. Entonces aquí va mi supermacro C
Venga va, otra posibilidad...

Código C:
Ver original
  1. int main( )
  2. {
  3.   int base = 5;
  4.   int potencia = 2;
  5.  
  6.   printf( "%d^%d=%c%c\n", base, potencia, potencia+'0', base+'0' );
  7. }

... eso sí, creo que no sirve para calcular cualquier potencia...
  #19 (permalink)  
Antiguo 24/10/2014, 03:45
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Algoritmo potencia

Cita:
Iniciado por eferion Ver Mensaje
Venga va, otra posibilidad...

... eso sí, creo que no sirve para calcular cualquier potencia...
Pues no, para cualquier potencia no. Por ejemplo:

Código C++:
Ver original
  1. int base = 5;
  2. int potencia = 3;

Se está "quedando" con nosotros .

¡¡¡Saluditos!!!

  #20 (permalink)  
Antiguo 24/10/2014, 03:59
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Algoritmo potencia

Cita:
Iniciado por leosansan Ver Mensaje
Pues no, para cualquier potencia no.
... es que no me daba tiempo a probar todas las combinaciones jejejejeje
  #21 (permalink)  
Antiguo 26/10/2014, 06:50
 
Fecha de Ingreso: octubre-2014
Mensajes: 13
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Algoritmo potencia

Muchas gracias chicos! Con todo lo que habéis propuesto ya he logrado solucionarlo.
A los que les ha parecido una broma... a mí casi que también, pero es lo que hay, se trataba de un problema de eficiencia. Muchas gracias de nuevo.

Saludos!

Etiquetas: potencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:25.