题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
解题思路
这道题主要考查两点:第一,考虑了所有可能情况;第二,幂运算。
首先是所有可能情况,这跟平常做数学题的分类讨论一样。有什么可能的情况呢?幂函数需要考虑的是幂系数 (exponent) 小于 0,等于 0 和大于 0 三种情况,而底 (base) 则分为等于 0 和 不等于 0 两种情况。
- base = 0:
① exponent>0:返回 0
② exponent<0:报错(0 不能为分母)
注:题目说明了 exponent = 0 不用考虑 - base ≠ 0:
① exponent>0:返回 base^exponent
② exponent=0:返回 1
③ exponent<0:返回 1/(base^exponent)
根据上述分析的可能情况求解就可以。实现代码(幂运算未优化):
class Solution {
public:
double Power(double base, int exponent) {
if(base==0){
if(exponent<0){
throw new RuntimeException("分母不能为0");
}
return 0;
}
else if(exponent==0){
return 1;
}
else{
double res =1;
int exp = abs(exponent);
while(exp>0){
res *= base;
exp--;
}
// 下面if-else可简写为:
// return exponent < 0 ? 1/ res : res;
if(exponent>0){
return res;
}
else{
return 1/res;
}
}
}
};
优化幂运算: 指数的二进制表达是怎么样的呢?举个例子,13 表达为二进制就是 1101,那么 10 的 13 次方就是 10^1101 = 10^0001 × 10^0100 × 10^1000。通过位运算,& 1 和 >>1 来诸位读取指数的二进制表达。通过 &1 取出二进制表达中的 1,将该位代表的乘数累乘,最后得到最终结果。
实现代码:
class Solution {
public:
double Power(double base, int exponent) {
if(base==0){
return 0;
}
else if(exponent==0){
return 1;
}
else{
double res =1, cur = base;
int exp = abs(exponent);
while(exp!=0){
if(exp&1){
res *= cur;
}
exp = exp>>1; //移位
cur *= cur; // 每移一次位,代表的幂次高一位,cur加倍
}
return exponent<0?1/res:res;
}
}
};
参考链接:
1.https://www.nowcoder.com/questionTerminal/1a834e5e3e1a4b7ba251417554e07c00?f=discussion