Site icon Study Algorithms

Write a program to calculate pow(x,n)

We will discuss how to calculate the result when a number ‘x’ is raised to the power ‘y’.
Originally C provides a standard function that allows us to directly use the power function. It can be used in the following manner.

#include<stdio.h>

//We need to import this file
#include<math.h>

int main(void)
{
    int x =4;

    //calculates 4 ^ 3.
    int result = pow(x,3);

    printf("Result = %d",result);
    return 0;

Now suppose that we need to write a custom function by ourselves. Here are the sample methods by which we can do so.
Simple Iterative method

int power(int base, int num)
{
    int result = 1;

    // this function will return base ^ num
    int i= 1;
    for(i = 1; i<=num; i++)
        result = result * base;

    return result;
}

Recursive Method

int power_rec(int base, int num)
{
    if(num == 0)
        return 1;

    if(num--)
        return base * power_rec(base, num);
}

But in both these methods, the time complexity is of O(n), and this can take a long time in operation.
We can modify our code and take advantage of this property of maths:-
We can write 2^6 as (2*2*2) * (2*2*2)
That means, we can call the power function as power(base,num/2)
Here is the implementation of the same.

//Function to calculate x raised to the power y
int power(int x, unsigned int y)
{
    if( y == 0)
        return 1;
    else if (y%2 == 0)
        return power(x, y/2)*power(x, y/2);
    else
        return x*power(x, y/2)*power(x, y/2);
 
}

The technique we are using here is Divide and Conquer. We can further reduce its complexity to O(log n) by calculating the result power(base,num/2) only once and then using it further.

/* Function to calculate x raised to the power y in O(logn)*/
int power(int x, unsigned int y)
{
    int temp;
    if( y == 0)
        return 1;
    temp = power(x, y/2);
    if (y%2 == 0)
        return temp*temp;
    else
        return x*temp*temp;
}

If we change the type of ‘temp’ to float and the return type of the function, we can use the above function for float values as well.

Exit mobile version