剑指 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; } };
标签:return,Offer,double,sum,16,long,---,pow,次方 来源: https://www.cnblogs.com/lxpblogs/p/16696198.html