Leetcode 050. Pow(x, n)

https://leetcode.cn/problems/powx-n/description/

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。

 

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:

输入:x = 2.10000, n = 3
输出:9.26100
示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
 

提示:

-100.0 < x < 100.0
-2^31 <= n <= 2^31-1
n 是一个整数
要么 x 不为零,要么 n > 0 。
-104 <= xn <= 104

解答

考虑幂指数过大,不可能暴力逐个乘下去。
使用快速幂手段来解决该题
我们求解2^7  是 2*2*2*2*2*2*2 
注意到7的二进制是111,对应的 2^7 也可以表示成 2^1 * 2^2* 2^3 =  2*4*16
那么暴力的逐个乘时间O(n) 可以优化成时间O(logn)

代码如下

class Solution {
public:
    double myPow(double x, int n) {
        double ret = 1.0;
     
        while(n>0){
            if(n&1){
                ret *=x;
            }
            n>>=1;
            x*=x;
        }

        return ret;
    }
};

注意版本1 并不能通过 n 有负数。
我们添加负数标记,计算完成后 结果result变成 1/result;

class Solution {
public:
    double myPow(double x, int n) {
        double ret = 1.0;
        int flag =0;
        if(n<0) {flag =1;n=-n;}
        while(n>0){
            if(n&1){
                ret *=x;
            }
            n>>=1;
            x*=x;
        }
        if(flag==1) ret = 1/ret;
        return ret;
    }
};

版本2很接近胜利了,但是n的范围在计算+-n的时候已经超过int的最大值了。
使用longlong 解决,所以得出最后的正确版本

class Solution {
public:
    double myPow(double x, int m) {
        double ret = 1.0;
        int flag =0;
        long long n =m;
        if(n<0) {flag =1;n=-n;}
        while(n>0){
            if(n&1){
                ret *=x;
            }
            n>>=1;
            x*=x;
        }
        if(flag==1) ret = 1/ret;
        return ret;
    }
};

我的视频题解空间

posted on   itdef  阅读(15)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2021-01-17 Leetcode 108 将有序数组转换为二叉搜索树
2021-01-17 挑战程序设计竞赛 习题 poj 3050 Hopscotch
2021-01-17 挑战程序设计竞赛 2章习题 AOJ 0121 Seven Puzzle bfs
2017-01-17 网站架设学习笔记

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示