【剑指Offer-代码的完整性】面试题16:数值的整数次方

题目描述

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

思路1

因为不会溢出,可以直接使用循环相乘来求解。当指数(exponent)为整数时,直接返回结果;当指数为负数时,先将指数转为正数求解后,返回倒数,因为\(a^{-b}=\frac{1}{a^b}\)。代码如下:

class Solution {
public:
    double Power(double base, int exponent) {
        if(exponent==0)
            return 1;
        if(base==0.0) // base==0也行
            return 0;
        
        int absExp = exponent<0? -exponent:exponent;
        double ans = 1;
        for(int i=0; i<absExp; i++)
            ans*=base;
        
        if(exponent<0)
            return 1/ans;
        else return ans;
    }
};

思路2

因为

所以可以用递归来求解。代码如下:

class Solution {
public:
    double Power(double base, int exponent) {
        if(exponent==0)
            return 1;
        if(base==0.0) // base==0也行
            return 0;
        
        int absExp = exponent<0? -exponent:exponent;
        double ans = PowerWithAbsExp(base, absExp);
        
        if(exponent<0)
            return 1/ans;
        else return ans;
    }
    
    double PowerWithAbsExp(double base, int exponent){
        if(exponent==0)
            return 1;
        if(exponent==1)
            return base;
        
        double ans = PowerWithAbsExp(base, exponent/2);
        ans *= ans;
        if(exponent%2==1)
            ans *= base;
        return ans;
    }
};

在上面的代码中,可以用右移一位(exponent>>1)代替exponent/2,可以用exponent&1代替exponent%2==1。

猜你喜欢

转载自www.cnblogs.com/flix/p/12438831.html
今日推荐