LeetCode Online Judge 题目C# 练习 - Pow(x, n)
2012-10-10 05:14
561 查看
Implement Pow(x, n)
代码分析:
这么精妙的解法当然是网上抄来的。
思路是,把xn 的 n 写成2进制, 然后一位一位右移,x平方级增加,如果当前一位是 ‘1’, ret *= x。语文学不好,直接看例子
比如 25: 5 的二进制 ...000101
1) ret = 1.0, n 的第一位是 ‘1’, 所以 ret *= x = 2.0, x *= x = 4.0, n >>= 1 =....000010
2) ret = 2.0, n 的第一位是 '0', 所以 ret = 2.0, x *= x = 16.0, n >>= 1 = ... 000001
3) ret = 2.0, n 的第一位是 '1', 所以 ret *= x = 32.0, x *= x = 256.0, n >>= 1 = ...000000
n = 0,返回。
注意:
1)如果n < 0, 需要一个flag记住n < 0, 返回的时候 返回 1 / ret。
2)int.MinValue 的绝对值比 int,MaxValue 大一,所以会溢出,或者抛出异常。 返回这个 1 / Pow(x, int.MaxValue) * x;
public static double Pow(double x, int n) { bool is_neg = n < 0; //Because Math.Abs(int.MinValue) not exist. if (n == int.MinValue) { return 1 / Pow(x, int.MaxValue) * x; } n = Math.Abs(n); double ret = 1.0; while (n > 0) { if ((n & 1) == 1) ret *= x; x *= x; n >>= 1; } return is_neg ? 1 / ret : ret; }
代码分析:
这么精妙的解法当然是网上抄来的。
思路是,把xn 的 n 写成2进制, 然后一位一位右移,x平方级增加,如果当前一位是 ‘1’, ret *= x。语文学不好,直接看例子
比如 25: 5 的二进制 ...000101
1) ret = 1.0, n 的第一位是 ‘1’, 所以 ret *= x = 2.0, x *= x = 4.0, n >>= 1 =....000010
2) ret = 2.0, n 的第一位是 '0', 所以 ret = 2.0, x *= x = 16.0, n >>= 1 = ... 000001
3) ret = 2.0, n 的第一位是 '1', 所以 ret *= x = 32.0, x *= x = 256.0, n >>= 1 = ...000000
n = 0,返回。
注意:
1)如果n < 0, 需要一个flag记住n < 0, 返回的时候 返回 1 / ret。
2)int.MinValue 的绝对值比 int,MaxValue 大一,所以会溢出,或者抛出异常。 返回这个 1 / Pow(x, int.MaxValue) * x;
相关文章推荐
- LeetCode Online Judge 题目C# 练习 - Same Tree
- LeetCode Online Judge 题目C# 练习 - String to Integer (atoi)
- LeetCode Online Judge 题目C# 练习 - Valid Number
- LeetCode Online Judge 题目C# 练习 - Edit Distance
- LeetCode Online Judge 题目C# 练习 - Combination
- LeetCode Online Judge 题目C# 练习 - Sprial Matrix
- LeetCode Online Judge 题目C# 练习 - Add Binary
- LeetCode Online Judge 题目C# 练习 - Subsets
- LeetCode Online Judge 题目C# 练习 - Valid Sudoku
- LeetCode Online Judge 题目C# 练习 - Gray Code
- LeetCode Online Judge 题目C# 练习 - Subsets II
- LeetCode Online Judge 题目C# 练习 - Implement strStr()
- LeetCode Online Judge 题目C# 练习 - Longest Substring Without Repeating Characters
- LeetCode Online Judge 题目C# 练习 - Word Search
- LeetCode Online Judge 题目C# 练习 - Binary Tree Inorder Traversal
- LeetCode Online Judge 题目C# 练习 - Reverse Nodes in k-Group
- LeetCode Online Judge 题目C# 练习 - ZigZag Conversion
- LeetCode Online Judge 题目C# 练习 - Climbing Stairs
- LeetCode Online Judge 题目C# 练习 - Count and Say
- LeetCode Online Judge 题目C# 练习 - Anagrams