题目:实现函数double Power(double base,int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题。
一、第一种方法
大体分为以下四种情况:
(1)底数为0,则返回0;
(2)底数不为0,若指数为0,则返回1;
(3)底数不为0,若指数为正数,调用Powerresult函数计算结果;
(4)底数不为0,若指数为负数,取指数的绝对值,调用Powerresult函数计算结果,将此结果取倒数。
具体代码如下所示:
#include <stdio.h>
double Powerresult(double base,int exponent)
{
double result=1.0;
for(int i = 1;i <= exponent;++i)
{
result*=base;
}
return result;
}
double Power(double base,int exponent)
{
double result;
if(base == 0) //底数为0
{
return 0.0;
}
else //底数不为0
{
if(exponent == 0) //指数为0
{
return 1.0;
}
else if(exponent > 0) //指数为正数
{
result=Powerresult(base,exponent);
}
else //指数为负数
{
result=Powerresult(base,-1*exponent);
result=1.0/result;
}
}
return result;
}
int main()
{
printf("%f\n",Power(0,0));
printf("%f\n",Power(0,1));
printf("%f\n",Power(0,-1));
printf("%f\n",Power(2,0));
printf("%f\n",Power(2,3));
printf("%f\n",Power(-3,3));
printf("%f\n",Power(-3,2));
printf("%f\n",Power(3,2));
printf("%f\n",Power(2,-4));
printf("%f\n",Power(2,-3));
return 0;
}
运行结果如下:
二、第二种方法
采用递归的思路,例如求一个数的32次方,如果已经知道了它的16次方,那么只要在16次方的基础上在平方一次可以了,而16次方是8次方的平方,这样以此类推,求32次方只需要做5次乘法:先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,最后在16次方的基础上求32次方。
可用如下公式求a的n次方:
具体代码如下所示:
#include <stdio.h>
double Power(double base,int exponent)
{
if(exponent == 0)
{
return 1;
}
if(exponent == 1)
{
return base;
}
double result=1.0;
result=Power(base,exponent/2);
result*=result;
if(exponent & 0x1 == 1) //判断指数是否为奇数
{
if(exponent > 0)
{
result*=base;
}
else
{
result*=(1.0/base);
}
}
return result;
}
int main()
{
printf("%f\n",Power(0,0));
printf("%f\n",Power(0,1));
printf("%f\n",Power(0,-1));
printf("%f\n",Power(2,0));
printf("%f\n",Power(2,3));
printf("%f\n",Power(-3,3));
printf("%f\n",Power(-3,2));
printf("%f\n",Power(3,2));
printf("%f\n",Power(2,-4));
printf("%f\n",Power(2,-3));
return 0;
}
运行结果如下所示:
在上面的代码中,用位与运算符代替了求余运算符(%)来判断指数是奇数还是偶数,位运算的效率比乘除法及求余运算的效率要高很多。