题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
输入描述
base,exponent
输出描述
base的exponent次方
题目分析
首先要注意,指数正负和零的情况判别:
①任何数的0次方等于0
②0不能做除数(也就是指数为负时,基数不能为0)
解法一 运行时间:27ms 占用内存:636k
public class Solution {
public double Power(double base, int exponent) {
int flag = exponent;//接下来exponent会改变
if(exponent==0){
return 1;
}
if(exponent<0){
exponent = -exponent;
if(base==0){
throw new RuntimeException("分母不能为0");
}
}
double result = 1;
for(int i=0;i<exponent;i++){
result*=base;
}
return flag < 0 ? 1 / result : result;
}
}
解法二 运行时间:30ms 占用内存:510k
把指数以二进制的形式表达:
举例(10^13)有10^1101 = 10^0001*10^0100*10^1000。
通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
public class Solution {
public double Power(double base, int exponent) {
int flag = exponent;//接下来exponent会改变
if(exponent==0){
return 1;
}
if(exponent<0){
exponent = -exponent;
if(base==0){
throw new RuntimeException("分母不能为0");
}
}
double result = 1;
while(exponent!=0){
if((exponent&1)==1){
result*=base;
}
exponent>>=1;
base *=base; //指数右移一位,底数翻倍
}
return flag < 0 ? 1 / result : result;
}
}
解法三 运行时间:33ms 占用内存:629k
调用库函数
public class Solution {
public double Power(double base, int exponent) {
return Math.pow(base,exponent);
}
}
因为pow最终会调用一个native方法,所以时间上还是可以的。
时间: 2024-11-09 05:13:45