题目:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0
思路:
有几个需要注意的地方:
-
由于是double类型,所以不能直接使用“==”来判断,重写一个equal()方法判断是否相等;
-
pow()函数不能直接调用,应该重写一个getPower()方法;
-
优化求幂过程:
当n为偶数,a^n =(a^n/2)\*(a^n/2)
当n为奇数,a^n = a\^[(n-1)/2] \* a\^[(n-1)/2] * a
Java
package nowcoder;
public class S12_Power {
public double power(double base, int exponent) {
if (equal(base, 0.0) && exponent < 0){
return 0.0;
}
int absexponent = exponent;
if (exponent < 0) {
absexponent = -exponent;
}
double res = getPower(base, absexponent);
if (exponent < 0)
res = 1.0/res;
return res;
}
boolean equal(double num1, double num2){
if ((num1 - num2 > -0.0000001) && (num1 - num2) < 0.0000001){
return true;
}
return false;
}
<!--
当n为偶数,a^n =(a^n/2)\*(a^n/2)
当n为奇数,a^n = a\^[(n-1)/2] \* a\^[(n-1)/2] * a-->
double getPower(double b, int e){
if (e == 0)
return 1.0;
if (e == 1)
return b;
double result = getPower(b, e>>1);
result *= result;
if ((e & 1)==1)
result *= b;
return result;
}
public static void main(String[] args){
S12_Power s12 = new S12_Power();
double result = s12.power(2,-3);
System.out.print(result);
}
}
Python
class Power:
def power(self, base, exponent):
if self.equal(base, 0.0) and exponent < 0:
return 0.0
absexponent = exponent
if exponent < 0:
absexponent = -exponent
res = self.getPower(base, absexponent)
if exponent < 0:
res = 1.0/res
return res
def equal(self, num1, num2):
if num1-num2>-0.0000001 and num1-num2<0.0000001:
return True
return False
def getPower(self, b, e):
if e == 0:
return 1.0
if e == 1:
return b
res = self.getPower(b, e >> 1)
res *= res
if e&1==1:
res *= b
return res
if __name__ == '__main__':
test = Power()
print(test.power(2, -5))