【剑指offer】数值的整数次方

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
 
 
思路:
这题卡在没想到exponent可以是负数了...
 
自己想了一个比较好的方法,非递归,O(logN)算法
举例说明吧:设base = 2.5, exponent = 99
我们每次都会把base的幂次加倍
base 1   2.5
base2    base1*base1
base4    base2*base2
base8    base4*base4
base16   base8*base8
base32   base16*base16
base64   base32*base32
 
在计算的时候,只需要通过base 1* base2* base32 * base64 就可以得到99次幂
但是如何才能知道那个幂次的值需要乘进去,我们想到了exponent的二进制表达
凡是需要乘入的,exponent的二进制表达中那一位一定为1.
所以我们只要每次一平方的时候把判断的位数向后移一位即可。
double Power(double base, int exponent) {
        if(exponent < 0) //处理负数,这里最开始没想到 卡了很久
        {
            base = 1 / base;
            exponent = (-exponent);
        }
        double d = base;
        double ans = 1;
        int bit = 1;
         
        while(exponent != 0)
        {
            if((exponent & bit) != 0) //如果exponent的当前位是1
            {
                ans *= d;
                exponent &= (exponent - 1);
            }
            d = d * d;
            bit = bit << 1;
        }
 
        return ans;
    }

 

递归版本

double Power(double base, int exponent) {
        if(exponent < 0)
        {
            base = 1 / base;
            exponent = (-exponent);
        }
        if(exponent == 0)
            return 1;
        else
        {
            double tmp = Power(base, exponent >> 1);
            if((exponent & 0x1) == 0)
                return tmp * tmp;
            else
                return tmp * tmp * base;
        }
    }

 

posted @ 2015-07-24 20:34  匡子语  阅读(192)  评论(0编辑  收藏  举报