给定一个double类型的浮点数base和int类型的整数exponent,求base的exponent次方
package mypack6;
public class Solution {
//给定一个double类型的浮点数base和int类型的整数exponent,求base的exponent次方
//思想手段,二分幂
//也可以采用快速幂
/*情况
* 底数为0,指数<0
*会出现对0求倒数的情况,需要设置一个全局变量
*判断底数是否等于0,由于底数base为double,所以不能用==判断
* 优化求幂次数(2分幂)
*偶:a^n=(a^n/2)*(a^n/2)
*奇:a^n=a^[(n-1)/2]*a^[(n-1)/2]*a
* Olog(n)*/
boolean invalidInput=false;
//传入
public double Power(double base,int exponent){
//如果底数等于0并且指数小于0
//浮点数为什么不能用==
/*
* IEEE754
* 有误差
* ==是严格意义上的相等
* 如何解决
* 确定一个误差范围 之内相等
* BigDecimal 其实就是确定一个取舍范围*/
//判断base是不是0.0相等 底数为0, 指数小于0 计算的时候分母为0
if(equal(base,0.0)&&exponent<0){
invalidInput=true;//输入无效
return 0.0;
}
//把输入的指数装在另一个盒子
int absexponent=exponent;
//如果指数小于0将指数转正
if(exponent<0){
absexponent=-exponent;
}
//合格的底数和指数传进去处理
double res=getPower(base,absexponent);
if(exponent<0){
//指数小于0,结果取倒数。
res=1.0/res;
}
return res;
}
//判断两个double类型的变量是不是相等
boolean equal(double num1,double num2){
if(num1-num2>-0.000001&&num1-num2<0.000001)
return true;
else
return false;
}
//求出b的e次方的方法
double getPower(double b,int e){
//如果指数为0,返回1
if(e==0){
return 1.0;
}
//如果指数为1,返回b
if(e==1)
return b;
//上面是两种特殊情况
//e>>1等于e/2 这里是求a^n=(a^n/2)*(a^n/2)
//把指数分成两份我们计算
double result=getPower(b,e>>1);
//实际上的计算是在这里完成的
result*=result;
//如果n为奇数 ,则要再乘一次底数base
//转换为二进制计算
//一个整数 n,n&1 这个表达式 可以用来 判断 a的奇偶性。
//二进制的末位为 0表示偶数,末位为 1表是奇数。
//使用 n%2 来判断奇偶性 和 n&1 是一样的作用,但是 n&1 要快好多
if((e&1)==1){
//奇数的n-1是怎么表示的
//因为首先判断是不是奇数再这样乘所以不用表示n-1
result*=b;
}
return result;
}
public static void main(String[] args) {
Solution s=new Solution();
double power = s.Power(3.02, 3);
System.out.println(power);
}
}
总结: 转换为二进制计算
一个整数 n,n&1 这个表达式 可以用来 判断 a的奇偶性。
二进制的末位为 0表示偶数,末位为 1表是奇数。
使用 n%2 来判断奇偶性 和 n&1 是一样的作用,但是 n&1 要快好多
方法2:使用累乘法
package mypack6;
public class test2 {
//使用累乘法
public double powerAnother(double base,int exponent){
double result=1.0;
for(int i=0;i<Math.abs(exponent);i++){
result=result*base;
}
if(exponent>=0){
return result;
}
else {
return 1/result;
}
}
public static void main(String[] args) {
test2 e=new test2();
double v = e.powerAnother(3.02, 3);
System.out.println(v);
}
}
总结:O(n)时间复杂度高