leetcode-数值的整数次方
刷leetcode《剑指offer》中第十五题"数值的整数次方",以下记录解题思路。
题目
实现函数double Power(double base, int exponent),求base的exponent次方。 不得使用库函数,同时不需要考虑大数问题。
输入: 2.00000, -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25
解析
- 快速幂法,利用分治法,将n次方分两部分,不断分。

- 利用右移,不断累乘。

注意
- 右移过程记得防止整数溢出。
- 将n划分时候,需要分为偶数奇数,还有正负数。
具体代码实现
第一种方法
class Solution {
public double myPow(double x, int n) {
// 底数为0
if (x == 0) {
return 0;
}
// n为正数
if (n > 0) {
return power(x, n);
}
// n为负数
return power(1 / x, -n);
}
private double power(double x, int n) {
// 当n为0
if (n == 0) {
return 1;
}
// 将n划分两部分
double r = power(x, n / 2);
// 判断n是否为奇数,奇数需要多乘一个x
// 可改为 n&1 == 1
if (n > 0 ? n % 2 == 1 : (-n) % 2 == 1) {
return r * r * x;
} else {
// 偶数不需要多乘底数
return r * r;
}
}
} 第二种方法
class Solution {
public double myPow(double x, int n) {
long n_copy = n;
// n为负数
if (n_copy < 0) {
x = 1 / x;
n_copy *= -1;
}
double result = 1;
// 进行乘于自身操作
while (n_copy > 0) {
// n为奇数
if (n_copy % 2 == 1) {
result *= x;
}
x *= x;
n_copy /= 2;
}
return result;
}
}
阿里云工作强度 694人发布
