剑指 Offer JZ12 数值的整数次方

Posted 程序字母K

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer JZ12 数值的整数次方相关的知识,希望对你有一定的参考价值。

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。

方法一:

直接用库

//c++11支持,此类型次方
pow(base,exponent);

方法二:

次方(exponent)为几,base就乘几次;

        if(exponent<0){
            base=1/base;
            exponent=-exponent;
        }
        double ret=1.0;
        while(exponent--){
            ret*=base;
        }
        return ret;

方法三:

调用递归

        if(exponent==0) return 1.0;
        double res=1.0;
        if(exponent>0){
            while(exponent--) res*=base;
            return res;
        }else 
            return 1/Power(base,-exponent);

方法四:

递归:be==be/2 * be/2

		
        if(exponent==0) return 1.0;
        if(exponent<0){//把exponent转为正
            base=1/base;
            exponent=-exponent;
        }
        double ret=Power(base,exponent/2);
        if(exponent&1){//奇数
        //if(exponent%2==1){
            return base*ret*ret;
        }else{
            return ret*ret;
        }

方法五:

这个方法和STL库的方法相同;

be : e的二进制每一位为1,就乘入;
假设求图片说明 ,已知6可以表示成二进制110
在这里插入图片描述
从每一个二进制开始,次方e不断向右移,当为1时,x为当前b * b*…为这个二进制为1的数的次方;

        //转换为>0
        if(exponent<0){
            base=1/base;
            exponent=-exponent;
        }
        double x=base;//记录base^0,base^1,base^2...
        double ret=1.0;
        while(exponent){
           if(exponent&1){
                ret*=x;//二进制位是1的,乘进去;
           }
            x*=x;//不断增大base*base*base...
            exponent>>=1;//二进制位移动
        }
        return ret;

STL库的源代码

        //STL标准库源码
        template <class T,class Integer, class MonoidOperation>
T power_this(T x, Integer n, MonoidOperation op){ // 可以看成求pow(x, n)
    if (n == 0)
        return identity_element(op); // 可以看成 1
    else{
        while ((n & 1) == 0){
            n >>= 1;
            x = op(x, x); //op看成乘法
        }
        T result = x; // 遇到 二进制中从低位到高位的第一个 1
        n >>= 1;
        while (n != 0){
            x = op(x, x);
            if ((n & 1) != 0)
                result = op(result, x);
            n >>= 1;
        }
        return result;
    }
}

以上是关于剑指 Offer JZ12 数值的整数次方的主要内容,如果未能解决你的问题,请参考以下文章

《剑指offer》JZ11 ~ JZ20

《剑指offer》JZ11 ~ JZ20

剑指offer 12.数值的整数次方

剑指 Offer JZ49 把字符串转换成整数

剑指offer 12. 数值的整数次方

剑指offer 12:数值的整数次方