剑指offer题目12:数值的整数次方
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
解答思路
其实没有什么难点,主要是想好各种出现的情况
- 底数为0的时候,计算没有意义的,和面试官确定好返回直接0就可以了
- 指数为0的时候,直接返回1
- 指数为负数的时候,需要变成倒数返回。
想好之后很容易写出,算法时间复杂度是O(n)
for(int i = 0; i < exponent; ++i) {
res *= base;
}
但可以实现优化成如下样子,这样就可以变成O(log2n):

实现代码
class Solution {
public:
double Power(double base, int exponent) {
// 底数为0 就直接返回0
if(Equal(base, 0.0)) {
return 0;
}
// 指数为0的话就是1
if(exponent == 0) {
return 1;
}
// 判断指数是否为负数
int exponentTemp = exponent;
if (exponent < 0)
{
exponentTemp = 0 - exponentTemp;
}
// 判断指数是否为偶数
int mod = exponentTemp % 2;
if(mod == 1) {
exponentTemp -= 1;
}
// 计算结果
double res = base;
for (int i = 2; i <= exponentTemp; i = i << 1)
{
res *= res;
}
// 如果是奇数则再乘底数
if(mod == 1 && exponent != 1) {
res *= base;
}
// 指数为负数则变成倒数
if(exponent < 0) {
res = 1 / res;
}
return res;
}
bool Equal(double num1, double num2) {
if(num1 - num2 < 0.0000001 && num1 - num2 > -0.0000001) {
return true;
} else {
return false;
}
}
};
作者:大傻逼
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号