一分钟一个小算法之快速幂

本文介绍了快速幂算法,通过将幂次分解为2的幂次相乘,利用位运算避免了常规乘法的低效。作者通过代码示例展示了如何使用位运算实现高效的幂次计算,并提到了可能的扩展如结合高精度计算。
摘要由CSDN通过智能技术生成

一、为何有快速幂?

        我们正常在求解关于a的b次幂的问题时,都是一个一个循环去乘:

#include <iostream>
using namespace std;

int a,b; //求a的b次幂

int main()
{
    cin >> a >> b;
    int ans = 1; //用来保存答案

    for(int i = 0; i < b; i++) //循环乘b次
    {
        ans *= a;
    }

    cout << ans;

    return 0;
}

        代码很简单,但是有个致命的缺点:速度太慢了。当b的值靠近2的30次幂时,循环次数也来到了十亿次左右,这是显然不能接受的。

        于是就有了这样一种可以快速算a的b次幂的方法:快速幂。

二、快速幂

        快速幂,顾名思义,快速计算幂的方式,那么如何能够做到快速呢?我们知道,如果要求a^{100},就只需要a^{50}\times a^{50}。也就是公式:a^{m+n} = a^{m}\times a^{n},这个一会儿会用。

        按照这种想法,先来看个数字小一点的,比如a^{11}=a^{8}\times a^{2}\times a^{1}。这里的8、2、1是随便选的数字吗?对于学习计算机的我们来说,肯定很熟悉,因为这几个数字与二进制有着密切的关系。

        那么到底是什么关系呢?仔细观察不难发现:11的二进制为1011,这里面的每个1就代表着十进制的8、2、1。那就恍然大悟了,这样求11次幂,我只需要乘这样的三个数字就行了,再结合刚才说的,我们发现每个因子都是2的整数次幂也就是a^{2^{n}}这种形式。再去观察11的二进制1011,从最后一位开始,把a翻倍,如果是1,就乘进来,如果是0就不管。

        这样整体思路就清晰了。下面就是处理这个1011,如何来转化我们需要的信息,毕竟输入的是11,你大可以自己写个算法把11转化为二进制数,但是我是肯定不会这样做的啦,其实计算机语言大多支持一种特殊的运算--位运算。我们用位运算就可以直接进行二进制的算数了,如果对位运算不了解,可以找我的另一篇一分钟算法系列中关于位运算的文章。

三、代码

#include <iostream>
using namespace std;

int a, b;

int quickpower(int a, int b) // 快速幂求a的b次幂
{
    int ans = 1; //用来保存结果
    int base = a; //用来实现a的平方以及a平方的平方……
    while (b != 0) //b的二进制还有位
    {
        if (b & 1) //与运算,只有b的二进制形式末尾是1,结果才是1
        {
            ans *= base; //结果的累积
        }
        base *= base; a平方以及a平方的平方……
        b >>= 1; //右移运算符,把b的二进制数各个位置向右移动一位,例如1011右移一位变为101
    }
    return ans; //结果返回
}

int main()
{
    cin >> a >> b;
    int m = quickpower(a, b);

    cout << m;

    return 0;
}

四、结束

        本文实现了快速幂的计算方法,当然对于快速幂的理解不止这一种,可以在网上找到很多的资料进行参考学习。

        同时,题目一般都会结合高精度,如果你还不知道高精度是什么,可以找我关于高精度的文章介绍,或者网上优秀博主的讲解。

        声明:本文为学习时的记录,如有错误,请及时私信。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值