剑指Offer 11 数值的整数次方

题目描述

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

思路

如书中所言,我就是那种上来就要写循环的人,完全没有考虑过负数和0;

代码

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
28
29
30
static public double Power(double base, int exponent) {
try {
if (base==0.0&&exponent<0) {
throw new ZeroException("");
}
else if (base==0.0&&exponent>=0)
{
throw new ZeroException("");
}
}catch (ZeroException e)
{
return 0.000000;
}
if (exponent==0)
return 1.0;
double a = 1.0;
int ex1=0;
if(exponent<0)
ex1= 0-exponent;
else
ex1=exponent;
for (int i = 0 ; i < ex1;i++)
{
a=base*a;
}
if (exponent<0)
return 1/a;
return a;
}

优化后的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static public double Power1(double base ,int exponent)
{
int n=exponent;
exponent=Math.abs(exponent);
if (exponent==0)
return 0;
if (exponent==1)
return base;
double result = Power1(base,exponent>>1);
result*=result;
if ((exponent&1)==1)
result*=base;
return n>0?result:1/result;
}

##收获

  1. 用例很重要,看到题最好先想想输入会是什么;
  2. 浮点类型的比较时会出现问题的;因为存在误差,所以应该差值<0.000001之类的就可以了;
  3. & 与运算 乐意完美的观察数字的奇偶,最后一位是1还是0;