Lets look at some solutions.
Solution 1 - Using recursion
Divide and Conquer C program
Time Complexity: O(n)
Space Complexity: O(1)
Algorithmic Paradigm: Divide and conquer.
Above function can be optimized to O(logn) by calculating power(x, y/2) only once and storing it.
Time Complexity of optimized solution: O(logn)
Let us extend the pow function to work for negative y and float x.
Source -http://www.geeksforgeeks.org/write-a-c-program-to-calculate-powxn/
Thanks.
Solution 1 - Using recursion
int pow(int x, int y)
{
if(y == 1) return x ;
return x * pow(x, y-1) ;
}
Divide and Conquer C program
/* 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);
}
/* Program to test function power */
int main()
{
int x = 2;
unsigned int y = 3;
printf("%d", power(x, y));
getchar();
return 0;
}
Time Complexity: O(n)
Space Complexity: O(1)
Algorithmic Paradigm: Divide and conquer.
Above function can be optimized to O(logn) by calculating power(x, y/2) only once and storing it.
/* 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;
}
Time Complexity of optimized solution: O(logn)
Let us extend the pow function to work for negative y and float x.
* Extended version of power function that can work
for float x and negative y*/
#include<stdio.h>
float power(float x, int y)
{
float temp;
if( y == 0)
return 1;
temp = power(x, y/2);
if (y%2 == 0)
return temp*temp;
else
{
if(y > 0)
return x*temp*temp;
else
return (temp*temp)/x;
}
}
/* Program to test function power */
int main()
{
float x = 2;
int y = -3;
printf("%f", power(x, y));
getchar();
return 0;
}
Source -http://www.geeksforgeeks.org/write-a-c-program-to-calculate-powxn/
Thanks.







0 comments:
Post a Comment