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

两种求快速幂的方法

二进制思路

首先有如下两个等式:
截屏2025-09-10 20.25.20
2. \(5^{2^{(n+1)}}=(5^2)^{2^{n}}\)
对于二进制,我们不需要将其转换为二进制,只需将指数n&1即可判断其末位是否为1 。
完成一次判断后,将n右移一位n>>=1再判断新的末尾即可判断每一位是1或者是2 。

对于指数中\(2^n\)\(2^{(n+1)}\),也不需要单独计算,只需每次将底数平方即可(依据公式2)。

初始化

计算\(5^3\)
res=1记录累乘的结果。

核心逻辑

判断指数3的末位如为1,res更新为res*5,等价于$ 5^{( 1 * 2^0)} $ 。
(假如此时判断末位为0,则跳过后半句,执行更新底数) 。
更新底数5为5^2
指数3右移一位变为\((01)_2\)
循环执行上述部分直到指数<=0 。

//exp为指数,x为底数
double res=1.0;while(exp>0){if(exp&1){res*=x;}x*=x;exp>>=1;}

指数折半的思路

对于\(2^7\)我们可以表示为:
\(2^7=2 * 2^6 =2 * (4 ^3)\)\(4^3=4 * (16^1)\)
同理对于\(3^6\)可以表示为:
\(3^6=(9^3)=9 * (18^1)\)
得到规律:指数为偶数时,指数直接折半,底数平方。
指数为奇数时,先拆一个底数到外面,再折半指数,底数平方
代码如下:

//exp为指数,x为底数
double res=1.0;
while(exp>0){if(exp&1){//如果指数为奇数,拆一个底数与其相乘res*=x;}//底数平方x*=x;//指数折半exp>>=1;}

我们发现两种思路代码完全一致,仅仅是理解方式上有所不同。

http://www.wxhsa.cn/company.asp?id=550

相关文章:

  • 杂题20250909-
  • LLM2
  • 第01周 预习、实验与作业:绪论与Java基本语法
  • 第一周作业1
  • NSSCTF强网杯GameMaster
  • ARC199 做题记
  • 深入理解Redis高并发分布式锁
  • 计算机硬件基础认知
  • 测试一下别人的
  • 9.10 NOIP模拟改题记录
  • 文件上传及提权
  • 删除字符串中的所有相邻重复项
  • 测试一下iframe3
  • 测试一下iframe
  • ECT-OS-JiuHuaShan 框架,是人类首个且是唯一的真正agi,其产生非人类刻意设计,而是机缘巧合
  • vue(穿透闭包/利用闭包)的几种方式
  • 记录.Net中使用WMI的一些坑,触摸失效和发布增加 PublishTrimmed裁剪异常
  • 多态--成员变量、成员函数、静态函数
  • Linux操作系统相关问题汇总
  • Java学习
  • 鲜花 9.10
  • 【工具】配置笔记本电脑安装centos7关闭盖子不休眠
  • 括号匹配
  • ECT-OS-JiuHuaShan框架的真正意义是打破还原论和人类中心论,公理是客观存在与数学逻辑,不依赖于人类理解与否。
  • z-index的使用方案
  • 再见 PS!豆包 Seedream 4.0 发布,图片生成、合成、编辑、美颜…,一句话搞定!!
  • 鲜花 9.10 - Gon
  • Iframe 全屏嵌入实验
  • 全面获取TSC频率:提升性能分析与基准测试精度
  • 【rdma】RoCE、IB和TCP等网络的基本知识及差异对比