¿Por qué mi método para esta pregunta es incorrecto? Escriba una función power (int a, int b), para calcular el valor de a elevado a b usando el ciclo while en c

Nota: soy un principiante total en c y esta pregunta me la dieron en mi tarea universitaria.

Pregunta: Escribe una función power (int a, int b)para calcular el valor de aelevado busando el bucle while en C.

Utilicé el siguiente código para la pregunta de hackerrank dada anteriormente:


#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int power(int a, int b);

int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */  
    
    int a, b, result;
    scanf("%d %d", &a, &b);
    
    result = power(a, b);
    
    printf("%d", result);
    
    return 0;
}

int power(int x, int y) {
    int z = x;

    while (y > 1) {
        x *= z;
        y--;
    }

    return x;
}

Pero este problema me dio errores en algunos de los casos de prueba. Esto se solucionó fácilmente simplemente cambiando z=xa z=1, x*=za z*=xy return (x)a return (z).

Pero no entiendo por qué mi código inicial estaba mal.

Answer

Usar z=1en lugar de z=xcorrige el resultado de y=0. [1]

Los otros dos cambios solo sirven para aclarar el código, pero no proporcionan ninguna diferencia de función.


  1. Los resultados siguen siendo incorrectos y<0incluso con esta solución. Sin embargo, la función no es muy útil y<0porque lo mejor que podría hacer es redondear a 0o 1, normalmente 0.

Tu codigo

int power(int x,int y)
{
    int z=x;
    while (y>1)
    {
        x*=z;
        y--;
    }
    return(x);
}

Comenzará a multiplicar ya con x, cuando ytodavía no se haya usado ninguno de los para la multiplicación. Por otro lado, usar 1daría como resultado 1 sin ninguna multiplicación y requiere la primera disminución de ypara convertirse en x. Esto coincide con el resultado requerido de 1 xa la potencia de 0.

Usar z*=xrepetidamente multiplica con x, lo que da como resultado x elevado a la potencia de y (al comenzar con 1).
Hacer x*=zda como resultado una multiplicación repetida con z (que era x en su código), lo que parece correcto. Pero debido a la necesidad de comenzar con 1 (ver arriba) Y para mantener el valor original de x, se necesita una segunda variable. Mantener el valor original xy almacenar el resultado cambiante en la nueva variable tiene más sentido que al revés.
Devolver la variable que contiene el resultado es obvio, solo es la otra variable después del cambio anterior.

Los valores negativos de yparecen ser irrelevantes para su tarea. Si también necesitan cubrirse, piense en el resultado de, por ejemplo x, a la potencia de 2, luego "deshacer" eso, restando 2 nuevamente del exponente dividiendo dos veces por xotra vez. Estás de vuelta en xa la potencia de 0. Luego "deshacer" de la misma manera otra vez, es decir, divide dos veces por x. El resultado es entonces xa la potencia de -2, es decir, 1/(x*x).