题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
思路1:
C++题解:如果底数为0,并且指数为负,如果不进行处理,那么会出现对0求倒数的情况。0的零次方在数学上是没有意义的,所以输出是0或者是1都可以。其它数的0次方都是1,因此将result的默认值赋为1。注意返回值得类型是double类型啊,python写久了C++总是忘记打分号,罪人。又一次发现牛客网测试用例不全,也是醉了,如果没有考虑到底数为0指数为负的情况也会给过。
class Solution {
public:
double Power(double base, int exponent) {
double result=1.0;
if(base==0.0&&exponent<=0)
return 0.0;
if(exponent<0){
exponent=exponent*(-1);
for(int i=0;i<exponent;i++){
result=result*base;
}
return 1.0/result;
}
else{
for (int i=0;i<exponent;i++)
result=result*base;
return result;
}
}
};
思路2:求次方可以再优化一下,如果是偶数次方,把它变成平方平方相乘a^(n/2)*a^(n/2),如果是奇数次方,把它变成a^((n-1)/2)*a^((n-1)/2)*a,还是用递归的思想。这里递归函数里的关键是新创建一个变量result时调用递归,将递归调用的结果和它自身相乘。
C++题解:
class Solution {
public:
double Power(double base, int exponent) {
if(base==0.0&&exponent<=0){
return 0.0;
}
unsigned int absexp=(unsigned int)exponent;
if(exponent<0)
absexp=(unsigned int)(-exponent); //如果指数小于0的话,就让指数变为相反数
double result=calculatepow(base,absexp);
if(exponent>0)
return result;
else
return 1/result;
}
double calculatepow(double base,int exponent){
if(exponent==0)
return 1.0;
if(exponent==1)
return base;
double result=Power(base,exponent/2); //指数对半分
result=result*result; //再相乘又是原来的数
if(exponent&0x1==1) //奇数
return result*base; //指数为奇数那么分解后要多乘一个底数
else
return result;
}
};