【剑指Offer】16_数值的整数次方(⭐⭐⭐⭐)

题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0(不需要考虑大数问题)

 

 

bool g_InvalidInput = false; //采用全局变量标识是否出错


class Solution {
public:
    //递归
    double PowerWithUnsignedExponent(double base, unsigned int exponent)
    {
        if(exponent == 0)
        {
            return 1;
        }
        if(exponent == 1)
        {
            return base;
        }
        //若exponent为32:32,16,8,4,2,1 => 
        //result:1,exponent,exponent*exponent,....
        double result = PowerWithUnsignedExponent(base, exponent >> 1); //用右移>>代替 /2
        //exponent为偶数
        result *= result;
        //exponent为奇数
        if((exponent & 0x1) == 1) //用位与&代替求余%
        {
            result *= base;
        }
        return result;
    }
    //指数为正数/负数
    double Power(double base, int exponent) 
    {
        //底数为零,指数是负数
        if( (fabs(base-0.0) <= 0.000001) && (exponent < 0))
        {
            g_InvalidInput = true;
            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.0 / result;
        }
        
        return result;
    }
};

  

 

posted @ 2019-08-27 16:16  XieXinBei0318  阅读(111)  评论(0)    收藏  举报