Pow(x, n)
来源:互联网 发布:七骑士亚服充值淘宝 编辑:程序博客网 时间:2024/05/23 02:01
1.题目
实现 pow(x,n) 不用担心精度,当答案和标准输出差绝对值小于1e-3
时都算正确
Pow(2.1, 3) = 9.261Pow(0, 1) = 0Pow(1, 0) = 1
2.算法
这道题属于数值计算的题目,方法和Divide Two Integers相似,就是把n看成是以2为基的位构成的,因此每一位是对应x的一个幂数,然后迭代直到n到最高位。比如说第一位对应x,第二位对应x*x,第三位对应x^4,...,第k位对应x^(2^(k-1)),可以看出后面一位对应的数等于前面一位对应数的平方,所以可以进行迭代。因为迭代次数等于n的位数,所以算法的时间复杂度是O(logn),数值计算的题要经常处理越界条件,本题也是,越界处理如下
1.当n为复数时,要对x求导,所以x不能过小,所以要检测x
2 我们要把n取绝对值,这样好算,所以取绝对值之前要检测n是否为Integer.MIN_VALUE
3 由于幂乘运算可能会很大,在下次循环成之前,要检测越界
public double myPow(double x, int n) { // Write your code here if (n == 0) { return 1.0; } double res = 1.0; if (n < 0) { // 当n为复数时,要对x求导,所以x不能过小,所以要检测x if (x > 1 / Double.MAX_VALUE || x < - 1 / Double.MAX_VALUE) { x = 1 / x; } else { return Double.MAX_VALUE; } // 我们要把n取绝对值,这样好算,所以取绝对值之前要检测n是否为Integer.MIN_VALUE if (n == Integer.MIN_VALUE) { res *= x; n++; } } boolean isNeg = false; n = Math.abs(n); // 判断最后结果正负,如果奇数个负值相乘,结果为负 if (n % 2 == 1 && x < 0) { isNeg = true; } x = Math.abs(x); while (n > 0) { if ((n & 1) == 1) { // 由于幂乘运算可能会很大,在下次循环成之前,要检测越界 if (res > Double.MAX_VALUE / x) { return Double.MAX_VALUE; } res *= x; } x *= x; n = n >> 1; } return isNeg ? -res : res; }
0 0
- Pow(x, n) / Super Pow
- LeetCode: Pow(x, n)
- LeetCode Pow(x,n)
- [Leetcode] Pow(x, n)
- LeetCode: Pow(x, n)
- Leetcode: Pow(x,n)
- [LeetCode] Pow(x, n)
- [Leetcode] Pow(x,n)
- Pow(x, n)
- 【leetcode】Pow(x, n)
- Pow(x, n)
- 求 pow(x, n)
- [LeetCode]Pow(x, n)
- Pow(x,n)
- Pow(x, n)
- Pow(x, n)
- [leetcode]Pow(x, n)
- LeetCode-Pow(x, n)
- zookeeper 分布式带来的不同开发设计点
- Android测试手机记录报错日志
- 欢迎使用CSDN-markdown编辑器
- 数组中只出现一次的数字
- 动画原理
- Pow(x, n)
- 欢迎使用CSDN-markdown编辑器
- 消除a标签的默认点击后虚线框的样式
- 【转自知乎】5G关键技术之波束成形
- /system/bin/service分析与使用
- [Ubertooth-general] sniff and decrypt/crack bluetooth 2.0
- 欢迎使用CSDN-markdown编辑器
- 七大比较排序总结
- 用JSONObject和JSONArray 解析json数据