Leetcode50. Pow(x, n)
题目:
实现 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] 。
题解:
方案一:暴力法:循环遍历
方案二:先计算xn/2x^{n/2}xn/2,
- 如果nnn为偶数,根据xn=(xn/2)2x^n=(x^{n/2})^2xn=(xn/2)2,计算得到xnx^nxn;
- 如果nnn为奇数,根据xn=(x(n−1)/2)2∗xx^n=(x^{(n-1)/2})^2*xxn=(x(n−1)/2)2∗x,计算得到xnx^nxn
java代码:
public static double pow(double x, int n) {
if (n < 0) {
x = x / 1;
n = -n;
}
return fastPow(x, n);
}
private static double fastPow(double x, int n) {
if (n == 0) return 1;
double d = fastPow(x, n / 2);
if (n % 2 == 0) {
return d * d;
} else {
return d * d * x;
}
}
public static double pow2(double x, int n) {
if (n == 0) return 1;
if (n < 0) {
x = 1 / x;
n = -n;
}
double result = 1.0;
while (n > 0) {
if (n % 2 == 1) {
result = result * x;
}
x = x * x;
n = n / 2;
}
return result;
}
scala代码:
/**
* 暴力算法
*
* @param x
* @param n
* @return
*/
def myPow(x: Double, n: Int): Double = {
var x1 = x
var n1 = n
if (n1 < 0) {
x1 = 1 / x1
n1 = -n1
}
var result = 1.0
for (i <- 0 until n1) {
result = result * x1
}
result
}
/**
* 递归n
*
* @param x
* @param n
* @return
*/
def myPow2(x: Double, n: Int): Double = {
var x1 = x
var n1: Long = n
if (n1 < 0) {
x1 = 1 / x1
n1 = -n1
}
fastPow(x1, n1)
}
def fastPow(x: Double, n: Long): Double = {
if (n == 0) 1.0
else {
val d = fastPow(x, n / 2)
if (n % 2 == 0) {
d * d
} else {
d * d * x
}
}
}
/**
* 迭代
*
* @param x
* @param n
* @return
*/
def myPow3(x: Double, n: Int): Double = {
var x1 = x
var n1: Long = n
if (n1 < 0) {
x1 = 1 / x1
n1 = -n1
}
var result = 1.0
var current_product = x1
var i: Long = n1
while (i > 0) {
if (i % 2 == 1) {
result = result * current_product
}
current_product = current_product * current_product
i = i / 2
}
result
}