当前位置: 首页 > news >正文

java快速幂

         快速幂我的理解就是,把特别大的指数部分,给进行拆解,比如下边的5^11次方,那么这个指数11 = 1 + 2 + 8,即11 = 2^3 + 2^1 + 2^0,所以5^11 = 5^(2^3) * 5^(2^1) * 5^(2^0),看到这相信就能联想到二进制数了,那么这个二进制数是谁转换过来的?很显然十进制11就等于二进制的1011,很显然,11 = 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0。

        所以我们就需要两个变量来帮助我们存一下5的2的那个几次方这个整体,还有前边的系数乘的是1还是0。

        假设我们用ans来存前边乘的系数0或1,用累乘来表示5的2的那个几次方这个整体。

        然后,我们就以下边代码中的5^11为例:

                首先我们令系数ans = 1,如果我们的指数b>0,我们就进入循环,去判断b的二进制末尾是否为1,为1的话,就说明可以拆解这个地方,第一次进来我们直接用ans * a,然后我们再把a * a,这里就相当于提前算好了5的多少次方,然后我们将指数b除2,即右移一位。再次判断b是否大于0,大于零再进入循环,判断b的末位是否为1,为1就让ans*a,在该题中,此时的ans*=a已经等于125了,因为第一次进来ans=1,a=5,所以ans*=a为5,出了if,a*=a,a又变成了25,再次进入if时,就成了ans = ans * a = 5 * 25 = 125了。如果不满足这个if条件,我们就不让ans*a,即相当于前边的系数为0,但是我们a该乘a还是得乘,b该右移还是得右移。

        最终返回ans就是快速幂的结果,即a^b。

    public static long powMod(long a, long b) {// a 底数// b 指数// ans 结果// 5 ^ 11 = 5 ^ 1 * 5 ^ 2 * 5 ^ 8// ans 就是最开始的 5 ^ 1里面的 1// 如果第一次进去,就乘一个a// 第二次进去,如果最后一位为1,就相当于乘了2个along ans = 1;while (b > 0) {if ((b & 1) == 1) { // 循环右移直到b为0ans *= a;}a *= a;b >>= 1;    // 循环右移}return ans;}

相关文章:

  • DIFY 又跟新了,来到 1.3.0 版本,看正文
  • 图像保边滤波之BEEPS滤波算法
  • Axure疑难杂症:利用中继器制作三级下拉菜单(逻辑判断进阶)
  • 【Axure视频教程】手电筒效果
  • Rust 学习笔记:关于切片的两个练习题
  • 图像处理篇---信号与系统的应用
  • vitest | 测试框架vitest | 总结笔记
  • 数据库学习笔记(十三)---存储过程
  • npm error code CERT_HAS_EXPIRED
  • 【机器学习】人工智能在电力电子领域的应用
  • 代码随想录算法训练营第60期第二十一天打卡
  • SpringCloud组件——Gateway
  • Android adb 安装应用失败(安装次数限制)
  • Android Compose vs 传统View系统:全面对比与选型指南
  • Linux 定时备份到windows 方案比较
  • MCP Servers玩玩WebUI自动化
  • 凸包问题 Graham 扫描算法 MATLAB
  • Android Framework 探秘
  • 大模型训练平台:重构 AI 研发范式的智慧基建
  • 新ubuntu物理机开启ipv6让外网访问
  • 印媒证实:至少3架印军战机7日在印控克什米尔地区坠毁
  • 李云泽:将尽快推出支持小微企业民营企业融资一揽子政策
  • 安赛乐米塔尔深化在华战略布局,VAMA总经理:做中国汽车板竞争力前三
  • 无人机穿越大理崇圣寺千年古塔时“炸机”,当地:肇事者已找到,将被追责
  • 五一假期上海两大机场客流量超193万人次,创历年同期最高
  • 罗马尼亚临时总统博洛让任命普雷多尤为看守政府总理