题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
解题思路
本题需要注意几个点:
1. 如果指数exponent是0,那么base不能为0,并且base(不为0)的exponent次方是1。
2. 如果指数exponent是负整数,那么base不能为0,并且base(不为0)的exponent次方就等于1/base的|exponent|次方,从而可以将指数化为正整数处理。
3. 如果指数exponent是正整数,那么有两种方法可以求解。第一种方法是比较朴素的方法,基于
进行求解。这种方法在指数a较大的时候,会比较慢。
第二种方法是利用指数的二进制表达式进行求解的。要求解x^a,我们首先将a转化为二进制形式,即
从而可得
定义一个变量cur,初始化为x,之后每次令cur=cur*cur。当指数a不为0时,每次取a的最后一位bi,bi只能是0或者1,如果是0,则不用处理;如果是1,将当前的cur乘到结果上。这种方法在a较大的时候会比第一种方法快。
代码
class Solution {
public:
double Power(double base, int exponent) {
//要考虑exponent的正负性
double result = 1;
if (exponent == 0) //为零
return result;
else if (exponent < 0) //为负数
{
if (base == 0) //不能为0
return 0;
base = 1 / base;
exponent = -exponent; //转化为正数
}
//朴素解法
/*
for (int i = 0; i < exponent; i++)
result *= base;
*/
//将指数看作二进制处理
double cur = base;
int num = 0;
while (exponent > 0)
{
num = exponent & 1; //取最后一位
if (num == 1) //如果是1
result *= cur;
cur *= cur; //更新为cur^2
exponent >>= 1; //右移一位
}
return result;
}
};