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;
            }
        }
  • 相关阅读:
    kettle表输入条件参数设置
    batの磕磕碰碰
    bat调用kettle的job文件
    数组转换成字符串输出
    bat调用带参数存储过程
    读取属性文件
    剑指Offer——删除链表中重复的结点
    剑指Offer——链表中环的入口节点
    剑指Offer——两个链表的第一个公共节点
    剑指Offer——表示数值的字符串
  • 原文地址:https://www.cnblogs.com/dplearning/p/4674477.html
Copyright © 2011-2022 走看看