LeetCode 50. Pow(x, n)(幂)

题目描述:

    Implement pow(xn).

例子:

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);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值