文章目录
  1. 1. 题目
  2. 2. 解析
  3. 3. 代码
  4. 4. 参考

题目

实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大树问题。

解析

这题看似简单,但是请别这么写-_-

1
2
3
4
5
6
7
8
double power(double base,int exp)
{

double result=1.0;
for(int i=1;i<=exp;i++)
result*=result;

return result;
}

还需要考虑:

  1. exp是负数怎么办?? 恩,那就是需要求倒数了
  2. exp是负数 但是base是0怎么办?? 恩,那就是无穷大了
  3. 复杂度能否小于O(exp)吗? a^5=a*a^4=a*(a*a)^2 所以可以使用递归法来做

考虑了这么多,那么可以直接上完整代码了

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 数值的整数次方
* 使用递归来求解,并且同时考虑特殊情况
* 复杂度为O(exp)
* @param base
* @param exp
* @return
*/

double power(double base,int exp)
{

if (exp==0) return 1; //任何数的0次方都是 1
if (exp == 1) return base;//任何数的1 都是自己
if(base == 0)
{
if(exp<0)
return Double.POSITIVE_INFINITY;//0的负数次方都是 无穷大
else
return 0;//0的正数次方都是0
}

double half = power(base, Math.abs(exp) >> 1);
//这里判断如何当前是奇数次数 还需要再乘以一个自己
double ret= (((exp & 1) == 1) ? base : 1.0) * half * half;
if(exp<0)//如果这个整数是负数的时候 则取倒数
ret=1/ret;
return ret;
}

参考


本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权

文章目录
  1. 1. 题目
  2. 2. 解析
  3. 3. 代码
  4. 4. 参考