剑指 Offer 16. 数值的整数次方
一、题目:
实现 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
-231 <= n <= 231-1
-104 <= xn <= 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shu-zhi-de-zheng-shu-ci-fang-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解析与代码:
1、最笨的方法,时间复杂度为O(n),超出范围。
class Solution { public: double myPow(double x, int n) { double sum=1; if(n>0){ while(n--){ sum*=x; } return sum; }else{ while(n++){ sum*=x; } return 1/sum; } } };
2、快速幂+递归:
将每一个都乘x变为每一次都乘x^2,这样复杂度就由O(n)变为O(logn)。如求2^11,可以变成2^0--->2^2--->2^4--->2^6--->2^8--->2^10*2 ,奇数次最后还要再乘一次x,而偶数次则不用.
class Solution { public: double myPow(double x, int n) { long long N=n; return n>=0 ? pow(x,N) : 1/pow(x,-N); } double pow(double x,long long n){ if(n==0) return 1.0; double y = pow(x,n/2); return n%2==0 ? y*y:y*y*x; } };
3、快速幂+二进制位
如求2^11,11的二进制为:1011 = 2^3+2^1+2^0 ,即2^(2^3+2^1+2^0)
class Solution { public: double myPow(double x, int n) { if(n==0) return 1.0; long long N=n; if(n<0){ N=-N; x=1/x; } double res = 1.0; while(N>0){ if((N&1)==1){ res*=x; } x*=x; N>>=1; } return res; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库