整理自剑指Offer
一:题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
二:解题思路
本题需要注意几个点
1.整数次方包括正数,负数,0
正数,正常求解
负数,按照正数求解后,取倒数,注意base为0的情况,分母不能为0
0:任何数的0次方均为1
2.base=0的情况 exponent整数,返回0
负数抛出异常(或用全局变量表示输出的0是合法的还是异常)
0,返回1
3.base是否等于0,不可以直接用base==0(因为float与double都有误差) 如果两个小数差的绝对值小于0.0000001,则认为两数相等
4.除以2,用>>右移运算符
判断是否为基数,用&与运算符,可以提高效率
5.优化求幂函数
当n为偶数,a^n =(a^n/2)*(a^n/2)
当n为奇数,a^n = a^[(n-1)/2] * a^[(n-1)/2] * a
三:代码实现
class Solution {
public:
bool invalidInput=false; //判断返回的0是异常true,还是正常输出false
//差值绝对值小于0.0000001,认为两数相等
bool equal(double num1,double num2){
if(num1-num2>-0.0000001 && num1-num2<0.0000001)
return true;
else
return false;
}
double PowerCore(double base,int exponent){
if(exponent==0)
return 1;
if(exponent==1)
return base;
double result=PowerCore(base,exponent>>1);
result*=result;
if((exponent&1)==1)
result*=base;
return result;
}
double Power(double base, int exponent) {
if(exponent==0)
return 1;//任何数的0次方为1
if(exponent==1)
return base;//任何数的1次方为其本身
if(equal(base,0)){
//基数0,幂指数大于0,返回0
if(exponent>0)
return 0;
//基数0,幂指数小于0,程序运行出错
if(exponent<0){
invalidInput=true;
return 0;
}
}
int absExponent=exponent;
if(exponent<0)
absExponent=-exponent;
double result=PowerCore(base,absExponent>>1); //>>1右移一位相当除以2
result*=result;
//奇数次方
if((absExponent & 1)==1) //&1相当于求余%
result*=base;
return exponent>0?result:1.0/result;
}
};