题目描述:实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
首先最容易想到的是利用for循环,如果x=5,n等于64,那么for循环需要执行64次,效率很低,这个题有一个更高效的解法
快速幂(递归实现)
class Solution {
double quickmul(double x,long n)
{
if(n==0)
return 1.0;
else
{
double temp=quickmul(x,n/2);
if(n%2==0)
return temp*temp;
else
return temp*temp*x;
}
}
public double myPow(double x, int n) {
long N=n;
double res;
return res=N>=0? quickmul(x,N):1.0/quickmul(x,-N);
}
}
快速幂循环迭代实现
迭代实现参考leetcode官方题解
首先举一个例子,从中看出规律
- x^38到 x^77,额外多乘的x,对于最终的结果来说是贡献了x
- x^9到 x^19,额外多乘的x,对于最终的结果来说贡献了 x^4
- x^4到 x^9,额外多乘的x,对于最终的结果来说贡献了 x^8
- 最一开始的x,对于最终的结果来说是平方了6次,贡献了x^64
把所有的贡献相乘,就可以得到最终的结果x^77,而这些贡献的指数部分都是2的幂次,每个额外乘的x在之后都会被平方若干次,而指数1,4,8,64,就是对应了77的二进制数(1001101)(二进制)中的每一个1.
java代码实现
class Solution {
double quickmul(double x,long n)
{
//作为结果返回
double ans=1.0;
//贡献的初始值是x
double temp=x;
while(n>0)
{
if(n%2==1)
{
//如果 n 二进制表示的最低位为 1,那么需要计入贡献
ans*=temp;
}
// 将贡献不断地平方
temp*=temp;
//舍弃n此时的二进制位,方便计算下一位二进制的最低位
//对一个数除2就可以舍弃最低位二进制位
n/=2;
}
return ans;
}
public double myPow(double x, int n) {
long N=n;
double res;
return res=N>0? quickmul(x,N):1.0/quickmul(x,-N);
}
}