剑指offer(12)——数值的整数次方

109 阅读2分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

题目 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题 示例 1:

输入:x = 2.00000, n = 10 输出:1024.00000

var myPow = function(x, n) {
    return Math.pow(x,n)
};

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

思路:

这道题我想到了两种方法,第一种方法当然是我之前一直首先想到的第一个方法, 就是使用java提供的java的API

进行运算;

return Math.pow(base, exponent); 但是这种方法肯定没有表达出这个题目需要给我们传授的含义。 第二种方法则利用指数的二进制进行右移来实现,因为一个正整数右移一位就相当于除2,每次将这个指数进行右移 然后分母平方。直到最后右移使得这个exponent为0; 思路一:本题以前也做过,只不是没有总结。有很多方法,效率不一样而已,第一种方法分情况讨论,然后采用分支递归,如果直接用循环,效率非常低O(n),现在分情况,分支递归,效率提高一半。考虑了底数和指数为0的特殊情况之后,就分指数是负数还是正数来讨论,如果是正数,那么分奇数还是偶数,因为分支递归,分成两条路,如果是偶数,刚好平分,如果是奇数,有一半要多一次运算。即

n为偶数,a^n=a^n/2a^n/2;n为奇数,a^n=(a^(n-1)/2)(a^(n-1/2))*a

时间复杂度O(logn)

如果指数x是负数的话,那么运算结果是1/result^(-x)。代码如下: ————————————————思路二:最快的运算就是进行二进制运算了,有时候用二进制去解题是真的很快,很不可思议。本题也可以用二进制去解。