剑指offer-数值的整数次方

题目描述

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

解题思路

对于这道题,要考虑四种情况: 

 1、底数为0,指数为负数的情况,无意义 

 2、指数为0,返回1 

3、指数为负数,返回1.0/base,-exponent 

4、指数正数,base,exponent 

第一反应我们会写出来的代码:

class Solution {
public:
    double Power(double base, int exponent) {
        double re=1.0;
        for(int i=1;i<=exponent;i++){
            re*=base;
        }
        return re;
    }
};
 
但如果输入的指数(exponent)小于1,即是0和负数的时候怎么办?上面的代码完全没有考虑,只包括了指数为正数的情况。
进阶版代码:

我们知道当指数为负数的时候,可以先对指数求绝对值,然后算出次方的结果之后再取倒数。既然有求倒数,我们很自然的就要想到有没有可能对0求倒数,如果对0求倒数怎么办?当底数base是零且指数是负数的时候,我们不做特殊的处理,就会发现对0求倒数从而导致程序运行出错。怎么告诉函数的调用者出现了这种错误?在Java中可以抛出异常来解决。

最后需要指出的是,由于0的0次方在数学上没有意义的,因此无论是输出0还是1都是可以接收的,但这都需要和面试官说清楚,表明我们已经考虑到了这个边界值了。

有了这些相对而言已经全面很多的考虑,我们就可以把最初的代码修改如下:

class Solution {
public:
    double Power(double base, int exponent) {
        double re=1.0;
        if(exponent==0) return 1.0;
        if(base==0) return 0;
        if(exponent<0){
            base=1.0/base;
        }
        while(exponent){
            exponent=(exponent<0)?(++exponent):(--exponent);
            re*=base;
        }
        return re;
    }
};

 上面代码运行时间是3ms,内存472k

优化求幂函数

当n为偶数,a^n =(a^n/2)*(a^n/2)
当n为奇数,a^n = a^[(n-1)/2] * a^[(n-1)/2] * a
时间复杂度O(logn)
参考资料:

猜你喜欢

转载自www.cnblogs.com/curo0119/p/9044956.html