Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jorge.esquibel en 18 Septiembre 2018, 04:16 am



Título: duda sobre elevar la potencia sin usar la multiplicación?
Publicado por: jorge.esquibel en 18 Septiembre 2018, 04:16 am
Si uso la multiplicación el código me quedaría así:
Código
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char *argv[]) {
  4. int acum=1,i,base,exponente;
  5.  
  6. printf("Digite la base: ");
  7. scanf("%d",&base);
  8. printf("Digite el exponente: ");
  9. scanf("%d",&exponente);
  10.  
  11.  
  12.  
  13. for(i=1;i<=exponente;i++){
  14. acum=acum*base; //el "*" no debe ser usado
  15. }
  16. printf("Resultado: %d",acum);
  17. return 0;
  18. }

Si se tiene que crear un código sin usar los operadores o condiciones de multiplicación o funciones de exponentes y la única regla es usar sumas.

Lo que se me ocurre es cambiar el acum=1 a acum=0.
acum= acum*base; a acum= acum+base;
pero en el ciclo for (i=1;i<=exponente;i++) el valor de exponente no me ayuda quedaría así mas o menos:

Código
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char *argv[]) {
  4. int acum=0,i,base,exponente;
  5.  
  6. printf("Digite la base: ");
  7. scanf("%d",&base);
  8. printf("Digite el exponente: ");
  9. scanf("%d",&exponente);
  10.  
  11.  
  12.  
  13. for(i=1;i<=exponente;i++){ /*la cantidad de veces que se sumara la base es lo que se pondra en el exponente. */
  14. acum=acum+base;
  15. }
  16. printf("Resultado: %d",acum);
  17. return 0;
  18. }



Título: Re: duda sobre elevar la potencia sin usar la multiplicación?
Publicado por: MAFUS en 18 Septiembre 2018, 23:14 pm
Ya que la multiplicación son sumas sucesivas y la exponenciación son multiplicaciones sucesivas, pues haces cada operación en funciones separadas: en una multiplicas usando sumas y en la otra, aprovechando la primera, elevas con multiplicaciones sucesivas. Algo así:

Código
  1. #include <stdio.h>
  2.  
  3. int func_mul(int m, int n) {
  4.    int retval = 0;
  5.    int negativo = n<0;
  6.  
  7.    if(negativo)
  8.        n = -n;
  9.  
  10.    while(n--)
  11.        retval += m;
  12.  
  13.    return negativo? -retval : retval;
  14. }
  15.  
  16. int func_exp(int base, unsigned ex) {
  17.    int retval = 1;
  18.  
  19.    while(ex--)
  20.        retval = func_mul(retval, base);
  21.  
  22.    return retval;
  23. }
  24.  
  25. int main() {
  26.    int x;
  27.    unsigned y;
  28.  
  29.    printf("base > ");
  30.    scanf("%d", &x);
  31.    printf("exp  > ");
  32.    scanf("%d", &y);
  33.    printf("%d", func_exp(x, y));
  34. }