力扣打卡:剑指 Offer 16. 数值的整数次方
解题思路
迭代法的快速幂还是按照已经通过实例的代码来写
否则会出现一些奇奇怪怪的问题
代码
class Solution {
public double myPow(double x, int n) {
return quickPow(x,n);
}
// 使用快速幂
public double quickPow(double x, int n){
double ans = 1;
boolean flag = n<0 ? true : false;
if(flag) n = -n;
while(n!=0){
if(n%2!=0) { // 问题:为什么不写成 n%2==1 (出错)非0的次方,最终都会到1,统计奇数的单次方只是可以将 2 ^ 4 --> 4 ^ 2 中的每一次转换中,底数的奇数
ans *= x;
} // 可以将底数作为原来的平方,那么需要的平方n就减半 也就是 2 ^ n --> ( 2^2 )^ n/2 == 4 ^ n/2
x *= x;
n /= 2;
}
return flag ? 1/ans : ans;
}
void m(double x, int n){
double ans = 1;
boolean flag = true;
if(n<0) {flag = false;n=-n;}
// 少年不要装逼,使用位运算不熟悉一不注意就超出时间限制
while(n!=0){
if(n%2 != 0 ){ // (n&1) != 0
ans *= x;
}
x *= x;
// n >>= 2;
n /= 2;
}
// return flag ? ans : 1/ans;
}
}