X的N次方求解——pow(x,n)实现
2014-09-29 16:34
232 查看
最近看到这样的一个题目求X的N次方,自己想了一些解决办法,记录一下留作日后参考。
求X的N次方,首先暴力求解:
很简单就可以实现,算法的复杂度是O(N),那么有什么办法可以优化呢,现在是O(N),那么就要朝着O(logN)的方向进行优化,以25为例X^25,可以先考虑X^1, X^2 ,X^4, X^8, X^16,然而还差X^9,同理我们将9分解为X^1, X^2 ,X^4, X^8,余下的就是X^1,将每个步骤的最大次方提取出来就是X^16,X^8,X^1,其实就是将25分解成16,8,1也就是25的二进制表示11001。把25分解后如何处理呢,遍历25的每一位i,如果是1,那么result *= X(2^i),最后也就求出X^25
= X^1 * X^8 *X^16。
O(logN)的这种思路通过递归的方式实现理解起来比较简单。
求X的N次方,首先暴力求解:
int exp(int x, int n) { int ret = 1; for(int i = 0; i < n; i++) { ret *= x; } return ret; }
很简单就可以实现,算法的复杂度是O(N),那么有什么办法可以优化呢,现在是O(N),那么就要朝着O(logN)的方向进行优化,以25为例X^25,可以先考虑X^1, X^2 ,X^4, X^8, X^16,然而还差X^9,同理我们将9分解为X^1, X^2 ,X^4, X^8,余下的就是X^1,将每个步骤的最大次方提取出来就是X^16,X^8,X^1,其实就是将25分解成16,8,1也就是25的二进制表示11001。把25分解后如何处理呢,遍历25的每一位i,如果是1,那么result *= X(2^i),最后也就求出X^25
= X^1 * X^8 *X^16。
int exp(int x, int n) { int ret = 1; if(n == 0) return ret; int k = n; while(k != 0) { if((k & 0x1) != 0) ret *= x; x *= x; k >>= 1; } return ret; }
O(logN)的这种思路通过递归的方式实现理解起来比较简单。
int exp(int x, int n) { if(n == 0) return 1; if(n == 1) { return x; } else { int s; int m = n / 2; s = exp(x, m); if(m % 2 == 0) { return s * s; } else { return s * s * x; } } }
相关文章推荐
- 实现pow(int x, int y),即x的y次方 ; 异或交换两个数;
- 【面试题】剑指offer11--求一个数的指数次方,模拟实现一个pow函数
- 二分算法实现幂函数x的n次方 Pow(x, n)
- 求解次方的次方。pow(a,pow(b,c))%p
- Leecode Pow(x, n)实现任意次方函数
- 用递归和栈的方法实现N皇后求解
- 回溯法求解 “n 皇后 问题”——Java 实现
- C++实现二分法求解方程
- 回溯法求解N人分N本书的问题(Java实现)
- 0/1背包问题的动态规划法求解 —— Java 实现
- c语言实现,用最小二乘法求解方程数多于未知变量的线性方程组的最适解(即矛盾方程组)
- 八皇后问题求解----C++实现
- 迷宫求解问题的简易实现(C++)
- 九宫格 数独 求解 算法 栈实现
- 回溯法求解N皇后问题(Java实现)
- 用C语言实现“百鸡问题”的求解
- 迷宫求解:严蔚敏老师的数据结构的实现
- Trie树的应用,一道算法问题求解 代码实现
- 利用MPI求解全源最短路径的并行算法实现
- 八皇后(或n皇后)c++的一种求解实现