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

C语言————快速幂

在 C 语言中,快速幂是一种用于高效计算幂运算(即 a^{n},其中 a是底数base,n 是指数power)的算法。常规的幂运算方法是通过循环将底数a连乘n次,时间复杂度为O(n)。而快速幂算法利用了指数的二进制特性,将时间复杂度优化到了O(log n),在处理大指数时能显著提高计算效率。

原理

快速幂算法的核心思想是将指数n 表示为二进制形式,然后根据二进制位的特点来减少乘法运算的次数。例如,计算 a^{13},因为13 的二进制表示是1101_2,即 13 = 2^3 + 2^2 + 2^0,那么a^{13} = a^{2^3 + 2^2 + 2^0} = a^{2^3} \times a^{2^2} \times a^{2^0}

我们可以通过迭代的方式,从a^1 开始,不断将指数翻倍(即(a^2, a^4, a^8, \cdots,并根据指数 n 的二进制位决定是否将当前的幂乘入结果中。

 比如a^9=a^4*a^4*a^1=a^2*a^2*a^2*a^2*a^1=a^1*a^1*a^1*a^1*a^1*a^1*a^1*a^1*a^1

翻倍其实就是平方,a^1翻倍就是a^2a^1*a^1,所以显然如果幂是奇数会多出来一个a^1,就需要特殊处理一下。

这里的二进制技巧是如果一个数是奇数,例如13 的二进制表示是1101_2,二进制第一位(2^0)权值上一定是1,因为其他二进制位上的数都代表2的幂,位运算也可以进行除2操作。

我们举的例子比较简单,实际上在计算中会多次多出a^1这类情况(以后出现的都是翻倍后的),把多出来的单独乘到结果中即可。

代码实现:

long long fastPower(long long base, long long power) {
    long long result = 1;
    while (power > 0) {
        if (power % 2 == 1) {//奇数拆出
            result = result * base % 1000;
        }
        power = power / 2;//除以2
        base = (base * base) % 1000;//返回的是result,这里可以加个1的判断跳出,没差
    }
    return result;
}

这个幂运算数值通常比较大,大多数快速幂都是为了获得结果的低位,所有取模运算,%1000就是保留3位。

包含位运算的代码
long long fastPower(long long base, long long power) {
    long long result = 1;
    while (power > 0) {
        if (power&1) {//奇数拆出
            result = result * base % 1000;
        }
        power>>=1;//除以2
        base = (base * base) % 1000;//返回的是result,这里可以加个1的判断跳出,没差
    }
    return result;
}

 

复杂度分析

  • 时间复杂度:O(log n),因为每次循环指数 n 都会减半。
  • 空间复杂度:O(1),只使用了常数级的额外空间。

http://www.kler.cn/a/542704.html

相关文章:

  • 香港中文大学 Adobe 推出 MotionCanvas:开启用户掌控的电影级图像视频创意之旅。
  • 5.实时推荐系统的设计与实现
  • 网络工程师 (32)TRUNK
  • 第四十章:职场转折:突破困境,重新出发
  • 作业:zuoye
  • RDK新一代模型转换可视化工具!!!
  • java项目之直销模式下家具工厂自建网站源码(ssm+mysql)
  • npm 常用命令大全
  • 数据总线/一致性维度/总线矩阵
  • Mac(m1)本地部署deepseek-R1模型
  • Ubuntu学习---跟着绍发学成后自学教程(附带优秀链接)
  • vue3:template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写?
  • git rebase 和 git merge的区别
  • 一句话总结一种排序算法,精炼
  • 【AI学习】如何高效掌握AI工具?解析主流大数据模型与学习路径
  • [每周一更]-(第133期):Go中MapReduce架构思想的使用场景
  • 【IDEA】2017版本的使用
  • Deepseek模拟阿里面试——数据库
  • 【vue深入】项目打包之后,移除console.log和debugge
  • AJAX XML技术详解
  • 51c自动驾驶~合集49
  • 面试准备-排序部分:快速排序、堆排序
  • 【matlab创新性滤波代码】平方根扩展卡尔曼滤波(SR EKF)例程,三维非线性系统的滤波,提供完整代码
  • 如果依靠IDEA来做JVM内存泄露的预防检测
  • 分享如何通过Mq、Redis、XxlJob实现算法任务的异步解耦调度
  • 前端知识速记:浏览器缓存机制 - 强缓存与协商缓存