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;
}
};
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用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 网站架设学习笔记