快速幂算法

快速幂(从最容易想到的思路一直到最终算法形成)

快速幂顾名思义是快速求出底数的n次幂的算法

初步了解

例题:人见人爱A^B
题目hdu2035
这个题目看起来很简单,但是考虑到了数据范围之后可能就会卡住
首先我们根据开始的想法写一下

int main()
{
    while(1)
    {
        scanf("%d%d",&a,&b);
        if(a == 0 && b == 0)
            return 0;
        ans = 1;
        for(int i = 1;i <= b;i++)
            ans *= a;
        ans %= 1000;
        printf("%d\n",ans);
    }
    return 0;
}

运行结果
然而结果可不会如你所愿,int型不可能承受的了,即使换上long long也毫无意义。

根据模运算进行改进

那么接下来根据模运算的特性对代码再进行调整
(a * b) % mod == (a % mod) * (b % mod) % mod

int main()
{
    while(1)
    {
        scanf("%d%d",&a,&b);
        if(a == 0 && b == 0)
            return 0;
        ans = 1;
        for(int i = 1;i <= b;i++)
            ans = (ans % 1000) * (a % 1000) % 1000;
        printf("%d\n",ans);
    }
    return 0;
}

现在再看一下运行结果:
运行结果
根据代码我们清楚的知道时间复杂度是O(n),对于一般的算法来说这已经算是比较优化的算法了,然而,现在让你计算2^10000000000的运行结果,那么当你运行的时候就只能慢慢等了,一般来说1s大概跑10的7次方,而这里是10次方,等待时间……

本次算法主题

现在就解决时间复杂度的问题。我们可以这么考虑2^10000000000
可以写成4^5000000000……一直优化下去那么又将时间复杂度从O(n)降到了O(logn)
具体如何解决就直接可以看代码

int main()
{
    while(1)
    {

        scanf("%d%d",&a,&b);
        if(a == 0 && b == 0)
            return 0;
        ans = 1;
        while(b > 0)
        {
            if(b % 2)
                ans = ans * a % 1000;
            a = a * a % 1000;
            b /= 2;
        }
        printf("%d\n",ans);
    }
    return 0;
}

如果还要进一步优化的话,将模运算换成位运算
if(b % 2) -->if(b & 1)
具体见 位运算

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值