题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
解题思路
本题做法比较简单,但需要注意的点比较多:
1、base为0的情况:判断base是否为0时也需要注意,由于计算机表示小数(包括float和double型小数)都有误差,所以不能直接用==判断两个小数是否相等,如果两个小数的差的绝对值很小,如小于0.0000001,就可以认为他们相等。
2、exponent为负数的情况:当exponent为负数的时候,可以先对exponent求绝对值,然后算出次方的结果之后再取倒数
代码
class Solution {
public:
double Power(double base, int exponent) {
if( abs(base-0.0) < 0.0000001 )
return 0;
if( exponent == 0 )
return 1;
if( exponent == 1 )
return base;
unsigned int absExponent = (unsigned int) exponent;
if( exponent < 0 )
absExponent = (unsigned int) (-exponent);
double res = 1.0;
for( int i=0;i<absExponent;i++ )
res *= base;
if( exponent < 0 )
res = 1.0 / res;
return res;
}
};
优化
上面方法的复杂度是O(n)的,当然还有稍微好一点的解法:当n为偶数时 base^n = base^(n/2) * base^(n/2)
当n为偶数时 base^n = base^(n/2) * base^(n/2) *base
这样的话就可以递归求出(n/2)时的大小,最后只只需要判断传入的expont的奇偶行再进行一步运算就可以了。这样的话,复杂度就是O(logn)了。
class Solution {
public:
double Power(double base, int exponent) {
if( abs(base-0.0) < 0.0000001 )
return 0;
if( exponent == 0 )
return 1;
if( exponent == 1 )
return base;
double res = 1.0;
unsigned int absExponent = (unsigned int) exponent;
if( exponent < 0 )
absExponent = (unsigned int) (-exponent);
res = Power( base, absExponent>>1 );
res *= res;
if( absExponent & 1 )
res *= base;
if( exponent < 0 )
res = 1 / res;
return res;
}
};