码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-24 22:16:04      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

给定一个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;
        }
    }

 

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

标签:

原文地址:http://www.cnblogs.com/dplearning/p/4674477.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!