描述
- 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
分析
1.普通方法,几次方就是乘以几次
2.位运算解法
普通解法
class Solution {
public:
double Power(double base, int exponent) {
double ret = 1;
if(exponent == 0){
return 1.0f;
}
else if(exponent < 0){
while(exponent!=0){
ret /= base;
exponent++;
}
}
else{
while(exponent!=0){
ret *= base;
exponent--;
}
}
return ret;
}
};
位运算
- 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) {
double ret = 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){
ret *= cur;
}
// 每次位移都要翻倍10^0,10^1,10^2,10^4,10^8
cur *= cur;
// 这里一定要重新给ex赋值,不然死循环了
// ex>>1这样的话ex不会变的,没注意,会死循环
ex>>=1;
}
return exponent>0?ret:1/ret;
}
};