栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

剑指 Offer 16— 数值的整数次方

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

剑指 Offer 16— 数值的整数次方

题目描述

实现 pow(x,n),即计算 x 的 n 次幂函数。不得使用库函数,同时不需要考虑大数问题。

解题思路—快速幂

求 x^n 最简单的方法是通过循环将 n 个 x 乘起来,依次求 x^1、x^2、x^3.......,时间复杂为 O(n)

快速幂法 可将时间复杂度降低至 O(log n)。

比如要求x^11,正常的乘积需要循环乘11次,时间复杂度为O(n)。

快速幂的思想就是将指数11 可以转成二进制数1011,则原来的式子可以转化成:x^(2^3+2^1+2^0) = x^(1*2^3) * x^(0*2^2) * x^(1*2^1) * x^(1*2^0)

                            =  x^(8) * x^(2) *  x^(1)。

11的二进制是1011,只有在 1 的位置上,才有相应的权重,所以需要判断 (b&1)是否等于1判断最右边是否为1。

此时只运算了3次乘积,时间复杂度降至O(logn)。

C++代码实现
class Solution {
public:
    double myPow(double x, int n) 
    {
       if(0==x)
       {
           return 0;
       }
       long b=n;//用long来接n,以防超出整数范围
       if(b<0)
       {
           x=1/x;
           b=(-b);
       }
       double res = 1.0;
       while(b>0)
       {
           if( (b&1)==1 )
           {
               // b的最右边为1,此时有权重
               res*=x;
           }
           x*=x; //x,x^2,x^4.....
           b=b/2;
       }

       return res;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768144.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号