剑指 Offer 16. 数值的整数次方
个人思路
思路
采用快速幂的方法,但中间有很多细节没有注意到
- 负指数问题——需要求倒数(注意0没有倒数)
- 负底数问题——需要判断指数的奇偶性
- 大数指数问题——需要对指数取模(本题没有要求用long long,因此,超过一定范围的指数就不需要再计算了)
代码优化
- &运算来判断奇偶性,注意&和“==”的优先级,应写为(n&1) == 1
- “>>” 右移做除2运算
个人错误思路代码
快速幂代码错了!!!!
class Solution {
public:
double ans = 1.0;
bool flag = true;//预处理
double myPow(double x, int n) {
if(flag == true){
if(n < 0){//指数为负数特判
x = 1 / x;
n *= -1;
}
if((x < 0.0) && (n % 2 == 0)){
x *= -1;
}
if(x == 1 || n == 0){
return 1.0;
}
flag = false;
}
if(ans < 0.000001 && x >= 0){
return 0;
}
if(n == 0){
return 1.0;
}
if(n & 1 == 1){
n = n >> 1;
ans = myPow(x, n) * myPow(x, n) * x;
return ans;
}else{
n = n >> 1;
ans = myPow(x, n) * myPow(x, n);
return ans;
}
}
};
正确思路代码
class Solution {
public:
double ans = 1.0;
const int MOD = 1e9 + 7;
double poww(double x, int n){
//快速幂部分
if(n == 0){
return 1.0;
}
if((n & 1)){
return myPow(x, n - 1) * x;
}else{
n = n >> 1;
double result = myPow(x, n);
return result * result;
}
}
double myPow(double x, int n) {
n = n % MOD;
if(n < 0){//指数为负数特判
x = 1 / x;
n *= -1;
}
if((x < 0.0) && (!(n & 1))){
x *= -1;
}
return poww(x, n);
}
};