【剑指offer】12-数值的整数次方

版权声明:转载请注明出处!欢迎大家提出疑问或指正文章中的错误! https://blog.csdn.net/pyuxing/article/details/89879846

本文系《剑指offer》的刷题记录,通过牛客网在线平台测试通过。
在线测试平台:牛客网
编程资料获取:CodeLab

1-Description

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

2-Solution

这里注意的是需要考虑指数小于0以及底数为0的情况,所以在写代码的时候要尽量保证代码的全面性,下面是解决代码

class Solution {
public:
    double Power(double base, int exponent) {
        double result = 1;
        if(exponent > 0){
            for(int i = 1; i <= exponent; ++i){
                result = result * base;
            }
        }
        else if(exponent < 0){
            for(int i = 1; i <= -exponent; ++i){
                result = result * base;
            }
            result = 1.0 / result;
        }
        return result;
    }
};

注意到求a的n次方可以使用如下的公式:
a n = { a n / 2 a n / 2 , n为偶数 a ( n 1 ) / 2 a ( n 1 ) / 2 a , n为奇数 a^n = \begin{cases}a^{n/2}·a^{n/2},&amp;\text{n为偶数} \\ \\a^{(n-1)/2}·a^{(n-1)/2}·a,&amp;\text{n为奇数} \end{cases}
而这一公式显然是可以用递归来实现的,所以可以得到如下的代码:

class Solution {
public:
    double Power(double base, int exponent) {
        if(exponent < 0) {
            base = 1/base;
            exponent *= -1;
        }
        if(exponent == 0) return 1;
        if(exponent == 1) return base;
        double result = Power(base,exponent >> 1);//右移运算符代替exponent除以2
        result *= result;
        if(exponent & 0x01 == 1) result *= base;//位于运算符代替求余运算符(%)判断奇偶
        return result;
    }
};

PS:公众号上线啦,技术干货分享,欢迎关注。

猜你喜欢

转载自blog.csdn.net/pyuxing/article/details/89879846