题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
起初看起来简单,但是实际做起来考虑的很多,还不是那么容易,没有优化。
在线代码:
public class Solution {
public double Power(double base, int exponent) {
//最初的想法就是for循环控制次方不断相乘
//指数和低数不能同时为0
/* if(base==0&&exponent==0){
throw new RuntimeException("invalid input. base and exponent both are zero");
}
//指数为0就返回1
if(exponent==0){
return 1;
}
//求指数的绝对值
long exp=exponent;
if(exp<0){
exp=-exp;
}
//求幂次方
double result;
result=powerwith(double base,long exponent);
//如果指数是负数
if(exponent<0){
result=1/result;
}
}
public double powerwith(double base, long exponent) {
// 如果指数为0,返回1
if (exponent == 0) {
return 1;
}
// 指数为1,返回底数
if (exponent == 1) {
return base;
}
// 递归求一半的值
double result = powerwith(base, exponent >> 1);
//求最终的值,如果是奇数,还要乘以底数
result*=result;
if(exponent &1==1){
result*=base;
}
return result;
}*/
/**
* 1.全面考察指数的正负、底数是否为零等情况。
* 2.写出指数的二进制表达,例如13表达为二进制1101。
* 3.举例:10^1101 = 10^0001*10^0100*10^1000。
* 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
*/
if(exponent == 0){
return 1;
}else if(exponent > 0){
double num = base;
for(int i = 1; i < exponent; i++){
num = num * base;
}
return num;
}else {
double nums = base;
//对负数的处理
int flag = -exponent;
for(int i = 1; i < flag; i++){
nums = nums * base;
}
return 1/nums;
}
}
}