文章目录

  • 题目描述
  • 一、二进制幂的计算
  • 二、题解
    • 1.源代码
    • 2.源程序测试
  • 写在最后

题目描述

7.a.应用从左到右二进制幂算法来计算 a 17 a^{17} a17

本题目来源:《算法设计与分析基础》(美)莱维汀Leviti,A.)著;潘彦译.一3版.北京:清华大学出版社,2015 (2020. 12重印) 一书中第五章(分治法)课后习题6.5的第三题的a小问,对应原书P186(读者可自行对照)

注:本章节(第六章)主要讲述的是变治法,并对霍纳法则的特性以及复杂度进行了一定的分析,从左到右的二进制幂算法是基于霍纳法则算法而演变出来的,下面对霍纳法则进行讨论。


一、二进制幂的计算

当使用霍纳法则来计算 a n a^{n} an时,霍纳法则(又称秦九韶算法)的高效率的优点就被抹掉了,在对 a n a^{n} an的计算时,无论如何提出公因子来进行计算,都无法避免退化成对a进行蛮力自乘的算法,因此,我们引入了二进制幂计算的算法。

不太懂霍纳法则的同志可戳这里百度百科:霍纳法则

这里以从左至右计算 a 13 a^{13} a13为例(对应原书P185页例2),这里 n = 13 = 110 1 2 n\,\,=\,\,13 =\,\,1101_2 n=13=11012​
(将十进制转化为二进制),因此,我们有

n的二进制位 1 1 0 1
累乘器 a a a a 2 × a = a 3 a^{2}\times a = a^{3} a2×a=a3 ( a 3 ) 2 \left( a^3 \right) ^2 (a3)2 ( a 6 ) × a \left( a^6 \right) \times a (a6)×a

观察上述的算法,我们可以得到规律如下,用product表示累成器暂时的计算结果
p r o d u c t i = { p r o d u c t i = ( p r o d u c t i − 1 ) 2 × a , n 的第 i 位二进制为 1 p r o d u c t i = ( p r o d u c t i − 1 ) 2 , n 的第 i 位二进制为 0 (1) product_i\,\,=\,\,\begin{cases} product_i\,\,=\,\,\left( product_{i-1} \right) ^2\times a\,\,, n\text{的第}i\text{位二进制为}1\\ product_i\,\,=\,\,\left( product_{i-1} \right) ^2\,\,, n\text{的第}i\text{位二进制为}0\\ \end{cases}\tag{1} producti​={producti​=(producti−1​)2×a,n的第i位二进制为1producti​=(producti−1​)2,n的第i位二进制为0​(1)

这样子0101的间隔乘法其实最后会导致幂次的奇数和偶数的差异, 具体推导过程见原书第六章

即对应代码中的部分如下

for (int j = I-1; j >= 0; j--){//由于前面while存储循环的时候是从左->右对应低位->高位//故这里的代码是从后往前计算if (*(p + j) == 1)product = product * product * a;else product = product * product;}

二、题解

1.源代码

注:本代码实现过程仅仅使用int来对结果进行存储,对于一些较大幂次的计算可能不适用,读者可以自行定义能储存更多结果的数据结构或者使用高精度乘法,或者大数乘法来进行计算。

/*
Author: FeverTwice
Date:   2021 - 04 - 22
Function:   计算a的17次方PS:Homework of Algorithm lesson, Chapter 6
*/#include <iostream>
#include <cstdio>
#include <string>
#include <cmath>
using namespace std;int dec2bin(int b)
{//十进制转二进制int res = 0,j=1;while (b>0){res = res + j * (b % 2);b /= 2;j *= 10;}return res;
}int leftBrinaryExp(int a, int b) {int I = floor(log(b) / log(2));//计算b转化为二进制之后的位数,向下取整int *p = new int[I+1]; //定义动态数据组int b2 = dec2bin(b);  //十进制转化为二进制int i = 0;while (b2>0){//将二进制数逐位分离*(p + i) = b2 % 10;b2 /= 10;i++;}int product = a;    //二进制的最高位一定为1,初始化productfor (int j = I-1; j >= 0; j--){//由于前面while存储循环的时候是从左->右对应低位->高位//故这里的代码是从后往前计算if (*(p + j) == 1)product = product * product * a;else product = product * product;}return product;
}int main()
{cout << "请输入底数a与次数b" << endl;int a, b;//a为底数,b为次数cin >> a >> b;if (b == 0)cout << 1 << endl;else {int res = leftBrinaryExp(a, b);cout << res << endl;  //输出结果}return 0;
}

2.源程序测试

注:本题源程序测试环境Visual Studio 2019

1.Test set 1

2.Test set 2

3.Test set 3

4.Test set 4


写在最后

各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟! <(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知

利用从左到右二进制幂算法计算二进制的幂(霍纳法则升级版,变治法)相关推荐

  1. 快速幂算法(矩阵快速幂还不是很会。。日后会更新)

    PS:转载,自己写的不如人家,怕误导.转载地址:http://www.cnblogs.com/CXCXCXC/p/4641812.html 首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,按照 ...

  2. 算法学习三:使用霍纳规则计算多项式

    霍纳规则中的算法思想 在<算法导论>第二章的思考题中,描述了利用霍纳规则计算多项式的方法.以前自己在写程序的时候都是傻傻的简单粗暴地直接上了,看到这个算法的时候眼前一亮,就多看了一些,果然 ...

  3. 快速幂算法(理解快速幂只需两道题)

    重点看代码注释 题目 2088: [蓝桥杯]快速幂 时间限制: 1Sec 内存限制: 128MB 题目描述 给定A, B, P,求(A^B) mod P. 输入 输入共一行. 第一行有三个数,N, M ...

  4. 快速幂算法 超详细教程

    快速幂 求幂运算 快速幂引入 快速幂 二进制 快速幂 指数折半 快速幂的应用 求幂运算 求幂运算大家都不陌生,幂是指数运算的结果,当m是正整数时nᵐ的意义为m个n相乘,n的m次幂也就是n的m次方.用代 ...

  5. 快速幂算法及其在动态规划中的应用(矩阵幂)

    文章目录 一.快速幂算法引入 二.快速幂算法 三.快速幂算法在矩阵幂中的运算 四.LeetCode1220的快速幂做法 五.参考资料 一.快速幂算法引入   假如我们有一个需要求2^100的后三位的问 ...

  6. RSA密码的手动算法+快速幂算法

    公钥加密方案(非对称加密算法) 1.为什么要引入公钥加密方案? 密码学中的加密方案分成对称密钥和非对称密钥(也就是我们说的公钥加密,代表加密算法是RSA加密算法). 而对称加密方法有一个特点,任何通信 ...

  7. printf从右向左计算,从左向右打印

    printf从右向左计算,从左向右打印 1.第一个例子 #include <stdio.h>int main() {int x = 0;printf("%d,%d\n" ...

  8. 解决全局优化和离散问题的二进制多宇宙算法

    Binary multi‑verse optimization algorithm for global optimization and discrete problems 1.摘要 多宇宙算法已经 ...

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

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

最新文章

  1. 往往存储与计算机硬盘或其他,硬盘是计算机系统中信息资源最重要的存储设备其所存放信息-Read.DOC...
  2. 使用ansible部署安装corosync+pacemaker
  3. qt dll 1% 不是有效的win32应用程序
  4. AppDelegate瘦身之服务化
  5. dockerfile 安装mysql_dockerfile构建mysql镜像
  6. 为什么分布式一定要有redis,redis的一些优缺点
  7. clsq客户端android,Android NDK开发之 arm_neon.h文件ABI说明
  8. linux接收网络数据并存存储,Linux网络设备驱动之数据接收流程(六)
  9. readline安装
  10. Java中Integer与String类型互转
  11. inno setup 打包脚本学习
  12. 网络粘包解包问题杂谈
  13. vue-drag-resize + html2canvas合成图片并下载
  14. iOS输入框禁止输入emoji表情
  15. C语言实现控制台窗口隐藏
  16. 通过2048学习自定义view(一)
  17. mysql命令桌面壁纸_【upupoo动态桌面壁纸和mysql-jdbc.jar哪个好用】upupoo动态桌面壁纸和mysql-jdbc.jar对比-ZOL下载...
  18. Google Play 上架全流程_2022年谷歌应用商店上架流程
  19. Android11 使用NTP同步时间
  20. python123测试4四位玫瑰数_心理测试:4朵玫瑰,你最喜欢哪一朵?测测你这辈子会有多少情债...

热门文章

  1. 周末韶关行之乳源大峡谷
  2. Docker启动mysql服务
  3. 测试开发岗位-面试总结
  4. Pinpoint安装
  5. 1、顺序存储:线性表/栈/队列:理论+C语言实现--详细
  6. iphone4s 自动拨电话
  7. 分享一些Android集成融云音视频通话遇到的问题
  8. 程序猿专属福利~键盘选的好,下班回家早
  9. 和上司交谈的四个注意事项
  10. idea中Java连接MySQL后中文乱码解决办法