题目
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
思路
- 求一个double数的幂。
- 首先 0 0 0^0 00没有意义,题目说了base和exponent不同时为0,所以可以不考虑。
- 如果exponent为0,直接返回1。
- exponent为正数,幂为 b a s e e x p o n e n t base^{exponent} baseexponent。
- exponent为负数,幂为 1 / b a s e − e x p o n e n t 1/base^{-exponent} 1/base−exponent。
- 接下来是求幂的方式,直接累乘会超时,所以要用更快的方法。这道题还是考的对二进制位的理解。
- 假如有base = 3, exponent = 13, 则幂 3 13 = 3 ( 1101 ) 2 3^{13}=3^{(1101)_2} 313=3(1101)2,把指数13展开成二进制形式。接下来的分析指数都写成二进制。
- 3 13 = 3 ( 1101 ) = 3 ( 1 ) ∗ 3 ( 100 ) ∗ 3 ( 1000 ) 3^{13}=3^{(1101)} = 3^{(1)}*3^{(100)}*3^{(1000)} 313=3(1101)=3(1)∗3(100)∗3(1000)
- 3 ( 10 ) = 3 ( 1 ) ∗ 3 ( 1 ) 3^{(10)}=3^{(1)}*3^{(1)} 3(10)=3(1)∗3(1), 3 ( 100 ) = 3 ( 10 ) ∗ 3 ( 10 ) 3^{(100)}=3^{(10)}*3^{(10)} 3(100)=3(10)∗3(10)
- 求幂的过程
- 初始化 res = 1
- 从低位到高位遍历exponent的位
- if 当前位为1, res *= base。
- base = base * base。
犯的错
不等于!=比位与&的优先级高,所以对于if ( (flag & exponent) != 0 )
这里一定要带括号。
代码
class Solution {
public:
double Power(double base, int exponent) {
double res = 0;
if ( exponent == 0 ) return 1;
if ( exponent > 0 )
res = PowerWithExponent( base, exponent );
else
res = 1.0 / PowerWithExponent( base, -exponent );
return res;
}
double PowerWithExponent(double base, int exponent ) {
int flag = 1;
double res = 1;
while ( flag <= exponent ) {
if ( (flag & exponent) != 0 )
res *= base;
base *= base;
flag <<= 1;
}
return res;
}
};
也可以把exponent不断右移。
class Solution {
public:
double Power(double base, int exponent) {
double res = 0;
if ( exponent == 0 ) return 1;
if ( exponent > 0 )
res = PowerWithExponent( base, exponent );
else
res = 1.0 / PowerWithExponent( base, -exponent );
return res;
}
double PowerWithExponent(double base, int exponent ) {
double res = 1;
while ( exponent ) {
if ( (exponent & 1) == 1 )
res *= base;
base *= base;
exponent >>= 1;
}
return res;
}
};
递归代码
class Solution {
public:
double Power(double base, int exponent) {
if ( exponent == 0 )
return 1;
if ( exponent > 0 )
return powerWithExponent( base, exponent );
if ( exponent < 0 )
return 1.0 / powerWithExponent( base, -exponent );
}
double powerWithExponent( double base, int exponent )
{
if ( exponent == 1 )
return base;
double result = powerWithExponent( base, exponent >> 1 );
result *= result;
if ( exponent & 0x1 == 1 )
result *= base;
return result;
}
};
递归的一个例子,结合代码看。