题目描述
Implement pow(x, n), which calculates x raised to the power n (xn).
Example 1:
Input: 2.00000, 10
Output: 1024.00000
Example 2:
Input: 2.10000, 3
Output: 9.26100
Example 3:
Input: 2.00000, -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25
Note:
-100.0 < x < 100.0
n is a 32-bit signed integer, within the range [−231, 231 − 1]
实现求x的n次幂的函数
思路
- 暴力循环法,但是超时
x的n次幂即n个x相乘
(前提是n为正数,所以对于负数n,需要稍加改造,将n的负号放到x上) - 分治法
把n次幂分成两份:即xn=xn/2 *xn/2
比如:28.=24. 24
需要注意的是解决n的奇偶问题和正负问题
定义个临时变量temp用来存储n次幂的一半:temp=myPow(x,n/2)
如果n为偶数:直接返回 temp * temp
如果n为奇数:需要在temptemp基础上再来一个x,此时多出来的这个次方的正负需要单独讨论:
(1)若n是正数,直接乘上一个x即可
(2)若n是负数,把负号移到x上,即除以一个x
实现
- 暴力循环(超时,没通过)
public double myPow(double x, int n) {
//直接暴力求解,x的n次幂即n个x相乘(前提是n为正数,所以对于负数n,需要稍加改造)
if(n<0){ //若n未负数,把负号放到x里,即x变成1/x
x=1/x;
n=-n;
}
double res=1; //x的n次幂的结果
for(int i=0;i<n;i++){ //n个x相乘
res=res*x;
}
return res;
}
- 分治法
public double myPow(double x, int n) {
//分治法,把次幂分为两半
//边界情况
if(n==0) return 1;
double temp=x;
temp=myPow(x,n/2); //temp为次幂的一半
//解决n的奇偶问题
//n若是偶数,直接两份temp相乘即可
if(n%2==0){
return temp*temp;
}
//n若是奇数,两份temp相乘之后,还差一个x
else{
//解决n正负问题
if(n>0){
return temp*temp*x;
}
else{
return temp*temp/x;
}
}
}