幂运算,即次方运算,例如计算 的值即是幂运算,在实现的时候我们往往是这样写的:

int __pow(int a,int b){int ans = 1;while(b--){ans *= a;}return ans;
}

其中a是底数,b为指数。从时间复杂度上分析这个算法的复杂度是O(n)级别,咋一看好像好很快,但是往往在比赛、做题的时候都需要处理指数很大运算,例如 ,即是 ,这个时候如果用上面的算法来计算的话,就要循环一百万次,程序就会超时。这个时候快速幂算法就呼之欲出了,先放代码实现:

int __poww(int a,int b){int ans = 1;while(b){if(b & 1 != 0){ans *= a;}a *= a;b >>= 1;}return ans;
}

快速幂算法的原理是通过将指数拆分成几个因数相乘的形式,来简化幂运算。在我们计算 的时候,普通的幂运算算法需要计算13次,但是如果我们将它拆分成 ,再进一步拆分成 只需要计算4次。嗯?哪来的4次?,别急,接着看。

这种拆分思想其实就是借鉴了二进制与十进制转换的算法思想,我们知道13的二进制是1101,可以知道:

实现的代码已经给出,原理就是利用位运算里的位移“>>”和按位与“&”运算,代码中 b & 1其实就是取b二进制的最低位,用来判断最低位是0还是1,再根据是0还是1决定乘不乘,不理解的话联系一下二进制转换的过程。b >>= 1其实就是将b的二进制向右移动一位,就这样位移、取最低位、位移、取最低位,这样循环计算,直到指数b为0为止,整个过程和我们手动将二进制转换成十进制是非常相似的。普通幂算法是需要循环指数次,也就是指数是多少就要循环计算多少次,而快速幂因为利用了位移运算,只需要算“指数二进制位的位数”次,对于13来说,二进制是1101,有4位,就只需要计算4次,快速幂算法时间复杂度是O(logn)级别,对于普通幂需要计算一百万次的来说,快速幂只需要计算6次,这是速度上质的飞跃,但是需要多注意溢出的问题。

快速幂算法的原理及实现相关推荐

  1. 【复习】快速幂算法详解

    快速幂算法 就是求一个高精度幂次取余时的一个快速算法 比如我们要求aba^bab%m的时候 应用于快速幂算法 也就是将O(n)转化为O(logn)的算法 他的原理就是: 252^525 = 2∗2∗2 ...

  2. java位运算求幂,程序员必学:快速幂算法

    前阵子,有小伙伴在我B站的算法教程底下留言 小伙伴们有任何疑问或者希望我解说任何内容,都可以在我的小我私家B站或民众号(xmg_mj)留言哦,我会尽我最大能力.只管抽时间去写文章\录视频来回应人人. ...

  3. 你必须掌握的,快速幂算法

    文章目录 1. 使用快速幂算法实现Pow(x,n) 2. 快速幂取余 1. 使用快速幂算法实现Pow(x,n) 求x的n次方,可以使用暴力解法,这种算法时间复杂度为O(n),并且,当x和n比较大的时候 ...

  4. LeetCode50——一题学会快速幂算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的第31篇文章,我们来看下LeetCode的第50题,求一个数的幂. 题意 这道题的题意只有一句话,就是给定两个数x和 ...

  5. mysql 幂运算_算法—史上最好快速幂算法讲解

    前言 快速幂是什么?顾名思义,快速幂就是快速算底数的n次幂. 有多快?其时间复杂度为 O(log₂n), 与朴素的O(n)相比效率有了极大的提高. 用的多么?快速幂属于数论的范畴,本是ACM经典算法, ...

  6. 快速幂算法(C++)

    基本概念 什么是快速幂呢?个人理解,就是更快速的计算幂运算. 比如计算a^b 刚学这个算法的时候我也很疑惑,幂运算不是有现成的公式么,直接pow(a,b)不就好了吗? 后来才明白,pow(a,b)的时 ...

  7. 六十八、快速幂算法、牛顿迭代法、累加数组+二分查找的变形

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 上次介绍了二分查找算法及其四个变形问题,下面介绍二分法常用的场景和典 ...

  8. 快速幂算法相关题目(Leetcode题解-Python语言)

    50. Pow(x, n) 快速幂算法的目的,就是快速计算 x 的 n 次方.基本思路是把 n 视作二进制数,则 n 可以被分解为多个 2 的幂次方之和,如 12 对应 1100 等于 0∗20+0∗ ...

  9. 【算法分析与设计】快速幂算法与快速幂取模算法

    文章目录 快速幂算法 算法分析 算法实现 位运算优化 BigInteger支持 快速幂取模算法 算法优点 算法推导 算法实现 BigInteger支持 本文完整代码实现(Java语言描述) 快速幂算法 ...

最新文章

  1. php自动轮播图代码,JavaScript如何实现动态轮播图效果?(代码示例)
  2. npm 加入 TC39 委员会,参与定制 JavaScript 标准
  3. Android应用实例收藏管理
  4. Oracle11g 修改数据库编码(UTF-8修改为GBK)
  5. python设计模式(五):适配器模式——各种类接口的合并
  6. 判断线段和直线相交 POJ 3304
  7. 617. 合并二叉树
  8. python pandas 日期_python+pandas+时间、日期以及时间序列处理方法
  9. java垃圾回收 分代_Java分代垃圾回收策略原理详解
  10. selenium-webdriver自动化测试工具
  11. 生信装虚拟机好还是云服务器,学习小组Day2笔记--潘潘
  12. 基于大数据的人工智能象棋
  13. Linux---如何创建文本文件
  14. 量子恒道统计-淘宝添加步骤
  15. proto_path passed empty directory name. (Use “.“ for current directory.)
  16. openstack项目中遇到的各种问题总结 其一(问题多多)
  17. 宜人贷 PaaS 数据服务平台Genie 简介(一)
  18. matlab对比两个文件,比较两个文本文件、MAT-file、二进制文件、Zip 文件或文件夹...
  19. 16种面试常见问题技巧回答
  20. 网络工程师备考经验总结

热门文章

  1. uniapp 更换导航栏图标并添加事件
  2. 考研数据结构的知识点汇总
  3. mysql socket socat_socat在Windows下的使用
  4. div水平居中的几种方法
  5. TextViewVertical实现文字并列竖排 如古诗,蒙古语等
  6. 学计算机去华科还是哈工大,我想学工科,哈工大、武汉大学、东南大学、华科,到底选哪个?...
  7. Docker 搭建「个人网盘」,放弃 Pandownload!
  8. matlab页面批量下载,[转载]matlab批量从NOAA网站下载验潮站数据
  9. 北京荣达对便携式打印机的行业分析
  10. Weka初体验——中文文本分类