一、题目
实现 pow(x, n) ,即计算 x
的整数 n
次幂函数(即,x^n
)。
示例 1:
输入:x = 2.00000, n = 10 输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3 输出:9.26100
示例 3:
输入:x = 2.00000, n = -2 输出:0.25000 解释:2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
n
是一个整数-104 <= xn <= 104
二、代码
class Solution {
public double myPow(double x, int n) {
// n==0,直接返回1
if (n == 0) {
return 1D;
}
// 先将n取绝对值,因为如果n为负数,我们需要先按照正数的求解方法求出一个答案,然后在最后用1/ans 这里需要考虑n为系统最小值的情况,因为系统最小值取绝对值还会是自己,所以当n为系统最小值的时候,给n加1,让其不再是系统最小值,这样就可以正常求出来一个绝对值,我们只需要在最后将少乘的那个x再累乘进答案即可
int pow = Math.abs(n == Integer.MIN_VALUE ? n + 1 : n);
// 记录答案
double ans = 1D;
// 累乘x的次幂
double t = x;
// 开始快速幂求解,直到pow右移为0
while (pow > 0) {
// 只保留对应的位为1时,将t累乘进ans
if ((pow & 1) == 1) {
ans *= t;
}
// 对t滚动累乘
t *= t;
// pow右移
pow = pow >> 1;
}
// 如果n是系统最小,上面的流程就少累乘了依次,这里再将其补上
if (n == Integer.MIN_VALUE) {
ans *= x;
}
// 返回答案,如果n为负数,那么答案就是1/ans
return n < 0 ? 1 / ans : ans;
}
}
三、解题思路
一个数的N次方怎么算最快?
t跟自己玩一遍的过程中按位来决定乘不乘到结果里去,一次性不容易求出来10^75次方的结果,我们可以找出75的二进制位就是1001011(很好求,以前学过求二进制的快速方法,就是那每一个二进制位代表的数去凑,能用上的位置就是1,不能用上的就是0),
那么现在我们就去让10自己去乘自己,然后根据75的二进制决定乘到什么时候就将结果添加到总结过中。
流程:
我们设置一个变量ans用来记录最终的结果
首先需要让ans = 1
1、开始第一轮,10,我们看75的二进制位1001011,右数第一位是1,所以这个10要乘到最终的结果中
ans = 1 * 101
2、开始第二轮,101 * 101 ,我们看75的二进制位1001011,右数第二位是1,所以这个101 * 101 也要乘到最终的结果中
ans = 1 * 101 * 102
3、开始第三轮,102 * 102 ,我们看75的二进制位1001011,右数第三位是0,所以这个102 * 102 不能乘到最终的结果中
ans = 1 * 101 * 102
4、开始第四轮,104 * 104 ,我们看75的二进制位1001011,右数第四位是1,所以这个104 * 104 也要乘到最终的结果中
ans = 1 * 101 * 102 * 108
5、开始第五轮,108 * 108 ,我们看75的二进制位1001011,右数第五位是0,所以这个108 * 108 不能乘到最终的结果中
ans = 1 * 101 * 102 * 108
6、开始第六轮,1016 * 1016 ,我们看75的二进制位1001011,右数第六位是0,所以这个1016 * 1016 不能乘到最终的结果中
ans = 1 * 101 * 102 * 108
7、开始第七轮,1032 * 1032 ,我们看75的二进制位1001011,右数第七位是1,所以这个1032 * 1032也要乘到最终的结果中
ans = 1 * 101 * 102 * 108 * 1032
至此,我们就找到了最终的结果ans,注意在整个过程中10的次幂结果都是计算出来的,这里只是为了节约空间就没写出结果,其实在完成上面的7个步骤之后,结果就已经计算出来了。