题目描述:
Implement pow(x, n).
例子:
Input: 2.00000, 10 Output: 1024.00000
Input: 2.10000, 3 Output: 9.26100
分析:
题意:计算x的n次方,其中x为double型,n为int型。
思路:这是一道经典的快速幂计算问题,借助于二分法的思想,已经有成熟的算法。假设ans初始化为1.0,进入循环:① 如果n为奇数,则ans *= x;② x *= x,n >>= 1;③ 当n小于1时,退出循环。
注意细节:① x == 0,直接返回0.0;② n == 0,直接返回1.0;③ n < 0,先计算-n的结果,最后返回答案的倒数;④ n如果是-(1 << 31) = -2147483648,那么-n会发生溢出,因此把首先把n转化为长整型表示(long long int)。
时间复杂度为O(log(|n|))。
代码:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
// fast exponential calculation
class Solution {
public:
double myPow(double x, int n) {
// return pow(x, n);
if(x == 0){
return 0.0;
}
if(n == 0){
return 1.0;
}
LL N = n;
bool sign = true;
if(N < 0){
sign = !sign;
N = -N;
}
double ans = 1.0;
while(N){
if(N & 1){
ans *= x;
}
x *= x;
N >>= 1;
}
return sign? ans: (1.0 / ans);
}
};