标签:return Offer double sum 16 long --- pow 次方
一、题目:
实现 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; } };
标签:return,Offer,double,sum,16,long,---,pow,次方 来源: https://www.cnblogs.com/lxpblogs/p/16696198.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。