zoukankan      html  css  js  c++  java
  • 【剑指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;
            }
        }
  • 相关阅读:
    2016-02-24 工作日记
    金字塔培训
    你找到自己的路了么?
    你是个成熟的职场人么?
    码农十年总结
    码农十年连载六
    码农十年连载五
    码农十年连载四
    码农十年连载三
    码农十年连载二
  • 原文地址:https://www.cnblogs.com/dplearning/p/4674477.html
Copyright © 2011-2022 走看看