1.1 二进制快速幂

  假设有这么一个需求,要求计算出3的100次方,该怎么优化算法,减少运算量?很明显,如果使用动态规划思想,我们知道这里面包含了大量重复运算,根本不需要99次乘法。比如我们可以使用49次乘法算出350,再平方一下,也就是多一次乘法运算,那么就是50次乘法就计算出了结果。
  好了,算法思想已经get到了,那么我们就继续想想,如果继续简化,简化到不能简化为止。也许聪明的读者已经想到了。那么就是先一次乘法,平方一下,计算出32,存入数组。然后再计算34,38,316,332,364。然后把100组合一下,100=64+32+4。也就是3100=364*332*34.
  总共使用了几次乘法呢?总共使用了8次乘法,计算32,34,38,316,332,364用了5次。计算364*332*34用了3次。这种用少量乘法次数,计算指数的算法被称为二进制快速幂(Binary Exponentiation)。
  但是再仔细想想,其实连数组都不需要的。我们这样计算:
p = 3 2 r = 1 p = 3 4 r = 3 4 p = 3 8 r = 3 4 p = 3 16 r = 3 4 p = 3 32 r = 3 36 p = 3 64 r = 3 100 p=3^2\\ r=1\\ p=3^4\\ r=3^4\\ p=3^8\\ r=3^4\\ p=3^{16}\\ r=3^4\\ p=3^{32}\\ r=3^{36}\\ p=3^{64}\\ r=3^{100}\\ p=32r=1p=34r=34p=38r=34p=316r=34p=332r=336p=364r=3100
  明白了原理后,代码就非常简单了,以下是python代码:

# _*_ coding:utf-8 _*_
# _*_ coding:utf-8 _*_
def binary_exponentiation(base, power):
    power_2 = 1
    r = 1
    p = base
    while power_2 <= power:
        if power_2 & power != 0:
            r *= p
        p = p * p
        power_2 = power_2 << 1
    return r


if __name__ == '__main__':
    print(binary_exponentiation(3, 100))
    print(3 ** 100)

    print(binary_exponentiation(32, 15))
    print(32 ** 15)

测试结果:

515377520732011331036461129765621272702107522001
515377520732011331036461129765621272702107522001
37778931862957161709568
37778931862957161709568
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt 是一款跨平台的应用程序开发框架,提供了丰富的工具和库,能够帮助开发者快速解析二进制数据。 在 Qt 中,可以使用 QByteArray 类来处理二进制数据。QByteArray 是 Qt 提供的一种动态数组类型,能够方便地存储和处理字节数组。通过 QByteArray,我们可以轻松地读取和操作二进制文件。 首先,我们需要将二进制数据读入到 QByteArray 中。可以使用 QFile 类打开二进制文件,并利用其 readAll() 函数将文件中的所有内容读取到 QByteArray 中。 一旦二进制数据被读入到 QByteArray 中,我们就可以使用 QByteArray 类中的函数来解析它。常用的函数包括 at()、mid()、left() 和 right()。通过这些函数,我们可以按照需要提取出二进制数据中的指定部分,并进一步对其进行处理。 除了 QByteArray,Qt 还提供了 QDataStream 类,它是对 QByteArray 进行高级操作的帮助类。QDataStream 提供了许多便捷的函数,用于将二进制数据解析为各种不同类型的数据,如整数、浮点数、字符串等。通过使用 QDataStream,我们可以更加方便地对二进制数据进行解析和读取。 总结起来,Qt 提供了丰富的工具和库,能够帮助开发者快速解析二进制数据。通过 QByteArray 和 QDataStream,我们可以方便地读取、解析和操作二进制数据中的内容,从而实现各种二进制数据的处理需求。无论是读取二进制文件、解析网络数据还是对二进制数据进行加工,Qt 都能够提供强大的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒过来摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值