剑指offer#16.数值的整数次方

陌路散爱 提交于 2019-12-02 02:37:38

数值的整数次方:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

保证base和exponent不同时为0

解法一:使用循环来求

分析:注意考虑特殊情况,当底数为0,如果指数是正整数,则可以返回1,如果底数为0,指数是负整数,那么就会出错,而且如果底数不是0,指数是负整数,则返回的应该是底数和正整数运算结果的倒数。因此要考虑齐全。

double PowerWithUnsignedExponent(double base,unsigned int exponent){
        double result = 1.0;
        for(int i=1;i<=exponent;i++)
            result *= base;
        return result;
    }
 double Power(double base, int exponent) {
        g_InvalidInput = true;
        if(base - 0.0 <= 1e-6 && exponent < 0){
            g_InvalidInput = false;
            return 0.0;
        }
        unsigned int absExponent = (unsigned int)exponent;
        if(exponent<0){
            absExponent = (unsigned int)(-exponent);
        }
        double result = PowerWithUnsignedExponent(base,absExponent);
        if(exponent<0)
            result = 1/result;
        return result;
    }

解法二:使用公式

a^n = a^(n/2)* a^(n/2)(当n为偶数的时候)
a^n = a^(n-1)/2 * a^(n-1)/2(当n为奇数的时候)
采用递归形式,每次求出resultresult,比如25方就先计算21=2,22=2*2=4,24=44=16,最后多计算一次16*2=32,因此判断奇数的条件是在最后一次才有判断成功多乘一个的可能。
判断奇数采用的是exponent&0x01 = 1,除2采用的是位运算,exponent>>1

double PowerWithUnsignedExponent2(double base,unsigned int exponent){
        if(exponent==0)
            return 1;
        if(exponent==1)
            return base;
        double result = PowerWithUnsignedExponent2(base,exponent>>1);
        result *= result;
        if(exponent & 0x01 == 1){
            //说明是奇数
            result *= base; 
        }
        return result;
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!