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

【快速幂算法】快速幂算法讲解及C语言实现(递归实现和非递归实现,附代码)

快速幂算法

快速幂算法可用分治法实现

不难看出,对任意实数a和非负整数n,有:
a n = { 1 , n = 0 , a ≠ 0 0 , a = 0 ( a n 2 ) 2 , n > 0 , n 为偶数 ( a n 2 ) 2 ∗ a , n > 0 , n 为奇数 a^n = \begin{cases} 1, & n = 0, a\neq 0 \\ 0, & a = 0 \\ \left( a^\frac{n}{2} \right)^2, & n > 0, n \text{为偶数} \\ \left( a^\frac{n}{2} \right)^2*a, & n > 0, n \text{为奇数} \end{cases} an= 1,0,(a2n)2,(a2n)2a,n=0,a=0a=0n>0,n为偶数n>0,n为奇数
这里n/2是C语言中的整除计算,所以n为奇数时需要额外乘一个a
n=0可作为递归边界

递归实现

  • a如果等于0则返回0

  • n=0时作为递归边界返回1

  • n不等于0时,递归求 a n 2 a^\frac{n}{2} a2n的值,再根据n的奇偶性返回相应值

代码
double exp2(int a, int n){if (a == 0)return 0;if (n <= 0)return 1;else{int x = exp2(a, n/2);if (n % 2)return x * x *a;return x * x;}
}

时间复杂度为O(logn)

非递归实现

非递归实现的方法在于将指数n分解乘二进制,将对应二进制位为1的乘起来,就得到最终的结果

例:计算 3 93 3^{93} 393

93 = ( 1011101 ) 2 = 64 + 16 + 8 + 4 + 1 93=(1011101)_2=64+16+8+4+1 93=(1011101)2=64+16+8+4+1

3 93 = 3 64 ∗ 3 16 ∗ 3 8 ∗ 3 4 ∗ 3 3^{93}=3^{64}*3^{16}*3^{8}*3^{4}*3 393=36431638343

代码
  • 变量s存储当前计算结果,并最终作为返回值

  • 变量b存储当前数位的乘方值

  • 遍历n的每一个二进制位

    • n & 1判断指数当前的最后一位是否为1
    • 每次循环将指数n右移一位(除以2),并将b累乘一次,计算当前的乘方
double exp2(int a, int n) {double b, s = 1.0;b = a;while (n > 0) {if (n & 1) {s *= b;}n /= 2;b *= b;}return s;
}

因为n有logn+1个二进制位,只需要次计算就能得到 a n a^n an,时间复杂度为O(n)

测试
double exp2(int a, int n) {double b, s = 1.0;b = a;while (n > 0) {if (n & 1) {s *= b;}n /= 2;b *= b;}return s;
}
int main()
{cout << exp2(3, 93);return 0;
}

结果

在这里插入图片描述

在这里插入图片描述

结果正确

由于递归算法涉及到对栈的操作,一般建议使用非递归算法

http://www.lryc.cn/news/537053.html

相关文章:

  • 3. 导入官方dashboard
  • 怎么理解 Spring Boot 的约定优于配置 ?
  • Dify 是什么?Dify是一个开源的LLM应用开发平台,支持快速搭建生成式AI应用,具有RAG管道、Agent功能、模型集成等特点
  • 数据预处理都做什么,用什么工具
  • windows蓝牙驱动开发-在蓝牙配置文件驱动程序中接受 L2CAP 连接
  • 【原理图PCB专题】自制汉字转码工具,适配Allgero 17版本 Skill
  • 欧拉公式在信号处理中的魔法:调幅信号的生成与频谱分析
  • 如何在Ubuntu中切换多个PHP版本
  • 基于opencv的HOG+角点匹配教程
  • Linux线程概念与线程操作
  • AI软件栈:LLVM分析(五)
  • Git指南-从入门到精通
  • Linux 文件系统挂载
  • Qt QSpinBox 总结
  • 【OJ项目】深入剖析题目接口控制器:功能、实现与应用
  • 周考考题(学习自用)
  • 【matlab】大小键盘对应的Kbname
  • LabVIEW与小众设备集成
  • Android 系统Service流程
  • Gartner预测2025年网络安全正在进入AI动荡时期:软件供应链和基础设施技术堆栈中毒将占针对企业使用的人工智能恶意攻击的 70% 以上
  • 华为最新OD机试真题-最长子字符串的长度(一)-Python-OD统一考试(E卷)
  • HAL库框架学习总结
  • 基于Spring Integration的ESB与Kettle结合实现实时数据处理技术
  • qt QOpenGLContext详解
  • 探索顶级汽车软件解决方案:驱动行业变革的关键力量
  • Deepseek R1模型本地化部署+API接口调用详细教程:释放AI生产力
  • DeepSeek 概述与本地化部署【详细流程】
  • FFmpeg Video options
  • 从51到STM32:PWM平滑迁移方案
  • openCV中如何实现滤波