题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不得使用库函数,
不需要考虑大数问题
思路:刚开始想的是最简单的那种思路,就是一个接着一个的乘,但是没有考虑到exponent是负数和0的情况。后来剑指中提供了一种新的思路。我们可以用以下公式求解a的n次方:
这样乘法的次数减少了,代码如下。在以下的代码里,要注意几点:(1)对特殊的情况进行了判断,当指数为1和0的时候进行单独的处理:(2)在指数除以2 的时候右移运算符号,并且在判断是奇数还是偶数时使用了按位与来判断。这样做提高了代码的效率。
以下的代码好像不是java的程序。。。。
代码:
double PowerWithUnsignedExponent(double base,unsigned int exponent){
if(exponent == 0)
return 1;
else if(exponent == 1)
return base;
double result = PowerWithUnsignedExponent(base,exponent>>1);
result*=result;
if(exponent & 0x1 == 1)
result*=base;
return result;
}
java程序(原文链接:https://blog.youkuaiyun.com/ouyangyanlan/article/details/73087877)
时间复杂度O(logn)
public class Solution {
public double Power(double base, int exponent) {
int n=Math.abs(exponent);
if(n==0)
return 1;
if(n==1)
return base;
double result=Power(base,n>>1);
result*=result;
if((n&1)==1)
result*=base;
if(exponent<0)
result=1/result;
return result;
}
}