实现 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
应该是会超时的,On解法
func myPow(x float64, n int) float64 {
if n == 0 {
return 1
}
if n < 0 {
return 1/violencePow(x, -n)
}
return violencePow(x,n)
}
func violencePow(x float64, n int) float64 {
var ans float64
ans = 1
for n > 0 {
ans *= x
n--
}
return ans
}
思路: 对于计算 x 的n次方,可以先对n进行降级 比如 2 的10次方 其实是 2^5 * 2^5 = 2^2*2 * 2^2*2
func myPow(x float64, n int) float64 {
if n < 0 {
return 1/fastPow(x, -n)
}
return fastPow(x, n)
}
func fastPow(x float64, n int) float64 {
if n == 0 { //0次幂等于1
return 1
}
y := fastPow(x, n>>1) //n>>1 = n/2
if n&1 == 1 { //n&1 = n%2
return y * y * x //奇数多了一次 *x
}
return y * y
}
class Solution {
public:
double myPow(double x, int n) {
long long N = n;
//注意n为负数 返回结果要 1/
return N < 0 ? 1/fastPow(x,-N) : fastPow(x, N);
}
double fastPow(double x, long long n) {
if (n == 0) {
return 1;
}
double y = fastPow(x, n>>1);
return n&1 == 1 ? y * y * x : y * y;
}
};
func myPow(x float64, n int) float64 {
if n < 0 {
return 1/fastPow(x, -n)
}
return fastPow(x, n)
}
func fastPow(x float64, n int) float64 {
var ans float64
ans = 1
for n > 0 {
if n&1 == 1 { //拿出次方的最后一位,如果是 奇数表示需要将当前x的值累计到结果上
ans *=x
}
x *=x //x在每次循环的时候都扩大一倍 = x^2
n = n>>1 //n每次右移一位,由底位处理到高位,同时底数需要扩大一倍
}
return ans
}
class Solution {
public:
double myPow(double x, int n) {
long long N = n;
//注意n为负数 返回结果要 1/
return N < 0 ? 1/fastPow(x,-N) : fastPow(x, N);
}
double fastPow(double x, long long n) {
double ans = 1;
while (n > 0) {
if (n&1 == 1) ans*=x;
x*=x;
n = n>>1;
}
return ans;
}
};