[算法]程序员必学:快速幂算法( 三 )
- x = (3 ^ 4) * (3 ^ 4) = (3 ^ 8)
- n右移1位 , 其二进制变成了10(对应的十进制是啥?不重要!!!)
- n的二进制是10
- x = 3 ^ 8, 其对应二进制位的值是0(n的最后一个二进制位)
- 所以不需要执行第5行代码
- 不需要将x乘进最终结果
- result = (3 ^ 1) * (3 ^ 4)
- x = (3 ^ 8) * (3 ^ 8) = 3 ^ 16
- n右移1位 , 其二进制变成了1(对应的十进制是啥?不重要!!!)
- n的二进制是1
- x = 3 ^ 16, 其对应二进制位的值是1(n的最后一个二进制位)
- 所以需要执行第5行代码
- 将x乘进最终结果
- result = (3 ^ 1) * (3 ^ 4) * (3 ^ 16)
- x = (3 ^ 16) * (3 ^ 16) = 3 ^ 32
- n右移1位 , 其二进制变成了0
- 每执行一次while的循环体 , n >>= 1, 会导致n的值减半
- 所以时间复杂度:O(logn)、空间复杂度:O(1)
Leetcode Leetcode上的第50号题50.Pow(x, n) , 刚好就可以用今天讲解的快速幂算法 。 以下是我的代码实现
// 递归 double myPow(double x, int n) {if (n == 0) return 1;if (n == -1) return 1 / x;double half = myPow(x, n >> 1);half *= half;return ((n & 1) == 1) ? half * x : half;}// 非递归double myPow(double x, int n) {long y = (ndouble result = 1.0;while (y > 0) {if ((y & 1) == 1) {result *= x;}x *= x;y >>= 1;}return (n } 【[算法]程序员必学:快速幂算法】需要提醒的是 - 这里我用的编程语言是Java , 大家可以根据自己熟悉的编程语言 , 对一些语法细节作出相应的调整
- Leetcode上的n可能是个负数 , 所以上面的代码针对负数的情况作了一些处理
推荐阅读
- 工业互联网@程序员的术与道:术——编程基本功之网络编程
- 小谢娱乐哦引来广大网友狂点赞,直呼炸天,程序员用Java实现扫雷小游戏
- Python爱好者社区漫画 | 程序员逆天改命
- Python爱好者社区| 程序员逆天改命,漫画
- 雷军■程序员辞去互联网工作,跨行去传统上市公司,结果上班第1天就蒙了
- 『程序员』身为京东最大股东的马化腾,却在扶持拼多多?刘强东:“请便!”
- 35岁程序员被电信云、华为和阿里同时录取,看到薪资比较后,酸了
- 程序员▲金山云逆势IPO,雷军身价超100亿美元!
- 阿里巴巴@33岁程序员年薪45万,想辞职去阿里上班,结果阿里年薪让他看懵了
- HyperAI超神经Semantic KITTI 评测榜首,识别可达厘米级别,新算法冲上
