一、题目描述
给定一个double类型的浮点数base和int类型的整数exponent。 求base的exponent次方。
二、思路解析
(1)常规思路:求次方的常规思路就是累积乘起来,所以可以用循环进行,但一定要注意特殊情况,保证程序的健壮性。
(2)用快速幂思想:a的n次幂可以 分开讨论,如果n为偶数时,a的n次方可以写成 a的n/2次方乘以a的n/2次方
如果n为奇数时,a的n次方可以写成 a的n/2次方乘以a的n/2次方再乘以a
所以可以考虑用递归求解。(推荐使用该方法,看最后的最新代码)
三、可运行java代码
/*
* 给定一个double类型的浮点数base和int类型的整数exponent。
* 求base的exponent次方。
*/
public class Solution_12 {
public static void main(String[] args) {
System.out.println(Power(2.5,-2));
System.out.println(power1(2.5, -2));
}
//方法一、常规方法
public static double Power(double base, int exponent) {
double res = 1;
if(exponent == 0) return 1;
if(exponent>0){
for(int i=0;i<exponent;i++){
res = res * base;
}
return res;
}else {
for(int i=0;i<Math.abs(exponent);i++){
res = res * base;
}
return 1.0/res;
}
}
//方法二、递归
public static double power1(double base,int exponent){
if(exponent==0) return 1;
if(exponent==1) return base;
int n = exponent>0?exponent:-exponent;
double result = power1(base, n>>1);
result *= result;
if((n&0x1)==1){
result *= base;
}
return exponent>0?result:1/result;
}
}
2020-9-29二刷最新代码:
class Solution {
public double myPow(double x, int n) {
if(x == 0) return 0;
if(n == 0) return 1;
boolean xf = false, nf = false; //这两个flag是判断x和n的正负号,先剥离开计算pow后,再做符号处理
double temp = x;
long nn = n; //为了防止2的-31次方是-2147483648,如果加符号的话就溢出了,所以用long类型
if(x < 0) {
xf = true;
x = -x;
}
if(n < 0){
nf = true;
nn = -nn;
}
x = pow(x,nn);
if(nf) x = 1/x;
if(xf==true && n % 2 == 1) x = -x;
return x;
}
public double pow(double x, long n) {
if(x == 1 || n == 0) return 1;
if(n == 1) return x;
double temp = pow(x, n/2);
if(n % 2 == 1) return temp*temp*x;
return temp*temp;
}
}