问题:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路:
当exponent为0时,任何数0次方为1,直接返回1;
将base赋值为一个临时double型变量tmp,将exponent赋值给一个int型flag作为标志位;循环,使得base与tmp相乘exponent-1次;
当标志位flag小于0时,将base取倒数,最后返回base。
注意:不要分别在exponent大于0,小于0条件下分别计算base的abs(exponent)次方,这样出现重复计算,使复杂度增加
方法一:
class Solution {
public:
double Power(double base, int exponent)
{
if(exponent==0)
return 1;
double tmp=base;
int flag=exponent;
exponent=abs(exponent); //取绝对值
for(int i=1;i<exponent;i++)
base=base*tmp;
if(flag<0)
base=1.0/base;
return base;
}
};
方法二:
直接利用pow函数求值
在C++中,pow有多个重载函数;
在dev中,pow(int,int)可以执行,但是在别的地方是不可以被编译的;会提示 :error C2668: “pow”: 对重载函数的调用不明确
可以看见,是没有pow(int,int)这个方法的;
正确的办法是pow(int,double(int));
下面看解题过程
class Solution {
public:
double Power(double base, int exponent)
{
return pow(base,exponent);;
}
};
方法三:
使用位运算计算幂
将次方值exponent转化为绝对值flag,看flag的二进制数
二进制数的每一位上如果值为1,表示该位有值,最后一位对应的值是base,倒数第二位对应的是base平方,倒数第三位base平方的平方……所以从后向前的每一位对应发值为base,base平方,base四次方,base八次方……
设结果初始值为result=1.0,发现对应位上数为1,就将result乘以对应值
例:
class Solution {
public:
double Power(double base, int exponent)
{
int flag=abs(exponent);
double result=1.0;
while(flag)
{
if(flag & 1)
result=result*base;
base=base*base;
flag>>=1;
}
return(exponent>0)?result:1.0/result;
}
};