题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
解题思路
1.全面考察指数的正负、底数是否为零等情况。
2.写出指数的二进制表达,例如11表达为二进制1011。
3.举例:10^1011 = 10^0001*10^0010*10^1000。
4.通过&1和>>1来逐位读取1011,为1时将该位代表的乘数累乘ret到最终结果。 每位移一次都要翻倍
参考代码
class Solution {
public:
double Power(double base, int exponent) {
//考虑1、base为0,exponent<0,无效的输入,2、指数为正,3、指数为负,4、指数为0四种情况即可
double res = 1.0f; // 初始
double cur = base;
int ex = 0;
if(exponent==0){
return 1.0f;
}
else if(exponent>0){
ex = exponent;
}
else{
// 负数的时候分母要处理下
if(base==0){};
ex = -exponent;
}
// 指数位运算向右移动,不等于0的时候累乘
while(ex){
// 位运算中遇到1代表一次累乘
// 3.举例:10^1011 = 10^0001*10^0010*10^1000。
if((ex&1)==1){
res *= cur;
}
// 每次位移都要翻倍10^0,10^1,10^2,10^4,10^8
cur *= cur;
// 这里一定要重新给ex赋值,不然死循环了
// ex>>1这样的话ex不会变的,没注意,会死循环
ex>>=1;
}
return exponent>0?res:1/res;
}
};