本文参考书籍 《剑指offer》 作者何海涛
01 题目
实现函数 double power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题。
02 解法一
最简单直接的解法, 直接for循环相乘
这种情况当输入的指数为<=0就没有办法处理,所以不可取
03 解法二
首先分析所有的可能情况
1.当exponent为0时,(1).base>0或者base<0时,结果为1。
(2)base为0时,可以约定为1,也可以约定为0,0的0次方无意义,具体可以和面试官讨论
2.当exponent为负数时 (1) base > 0 and base < 0,对exponent取绝对值得absexponent,取absexponent次方,最后取倒数。
(2) base = 0 ,0的倒数无意义,抛异常,或者返回其他规定的值
3.当exponent为正数,正常循环求值
代码如下:
base的乘方
判断两个double是否相等
计算机表示浮点数(float或double类型)都有一个精度限制,对于超出了精度限制的浮 点数, 计算机会把它们的精度之外的小数部分截断。因此,本来不相等的两个浮点数在 计算机中可能就变成相等的了。 float a=10.222222225,b=10.222222229,我们这里 忽略两个数之间的差特别小的差异,就当做是相等的
求base的exponent次方
03 解法3 乘方部分再次优化
base的exponent方有重复计算的部分,
(1)如 a^32 次方
a^32 = a ^ 16 *a^16 只需要计算一次 a^16次方就可以
再类推,a ^ 16= a ^ 8 *a^8 ,只计算一次 8 a^8次方就可以了
a ^ 8 = a ^ 4 *a^4
a ^ 4=a^2*a^2
a^2=a*a
(2) a^33 = a * a^16*a^16
可以总结为公式
代码