剑指offer16 数值的整数次方
实现函数double Power(double base, int exponent),求base的 exponent次方。
不得使用库函数,同时不需要考虑大数问题。
注意:
不会出现底数和指数同为0的情况
样例1
输入:10 ,2
输出:100
样例2
输入:10 ,-2
输出:0.01
思路:
首先重要的是考虑到base为0,或者exponent为0的情况。
然后考虑exponent的正负问题。
在计算base 的指数次方的时候,采用巧妙的计算方法:
base的n次方:
若base为偶数,则:
b
a
s
e
n
=
b
a
s
e
n
2
∗
b
a
s
e
n
2
base^{n}= base^{\frac{n}{2}} * base^{\frac{n}{2}}
basen=base2n∗base2n
若base为基数,则:
b
a
s
e
n
=
b
a
s
e
n
2
∗
b
a
s
e
n
2
∗
b
a
s
e
base^{n}= base^{\frac{n}{2}} * base^{\frac{n}{2}} * base
basen=base2n∗base2n∗base
AcWing-27 C++ code:
class Solution {
public:
double cal_pow(double base, int exponent){
if(exponent == 0){
return 1;
}
if(exponent == 1){
return base;
}
double result = cal_pow(base, exponent / 2);
result *= result;
if(exponent % 2 == 1){
result *= base;
}
return result;
}
double Power(double base, int exponent) {
if(base == 0){
return 0;
}else if(exponent == 0){
return 1;
}
//用来标记base的正负
int flag = 0;
if(exponent < 0){
flag = 1;
exponent = -exponent;
}
double result = cal_pow(base, exponent);
if(flag == 0){
return result;
}else{
return 1 / result;
}
}
};
AcWing-27 python code:
class Solution(object):
def cal_pow(self, base, exponent):
if exponent == 0:
return 1
elif exponent == 1:
return base
result = self.cal_pow(base, exponent // 2)
result *= result
if exponent % 2 == 1:
result *= base
return result
def Power(self, base, exponent):
"""
:type base: float
:type exponent: int
:rtype: float
"""
if base == 0:
return 0
elif exponent == 0:
return 1
flag = 0
if exponent < 0:
flag = 1
exponent = -exponent
result = self.cal_pow(base, exponent)
if flag == 0:
return result
else:
return 1 / result