Home Misc Write a program to calculate pow(x,n)

# Write a program to calculate pow(x,n)

0 comment

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.

#### You may also like

This site uses Akismet to reduce spam. Learn how your comment data is processed.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More