模板||快速幂

有那么一种算法可以让计算a^b变得更快,那就是快速幂。如果直接暴力计算的话需要计算b次。时间蛮长的。

题目描述:

  输入a,b.(a,b为整数)计算a^b。

输入输出格式

输入格式:

两个整数a、b。.

输出格式:

输出“a^b=s”

s为运算结果

 

前提:你需要了解二进制,十进制。位运算的知识(当然也可以没有,万事皆可模拟。)

没有位运算的:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<cmath>
using namespace std;
char e[10001];
int cd;
long long quickpow(long long a,char b[]) {
    long long ans=1,base=a;
    while(cd!=-1) {
        if(int(b[cd])!=0) ans*=base;//最后一位是1的话。
        base*=base;
        cd--;//抹去最后一位。
    }
    return ans;
}
void zh(long long a) {
    char zs[10001];
    int sum=0;
    while(a!=0) {
        zs[sum]=a%2;
        a/=2;
        sum++;
    }
    sum--;
    int js=sum;
    cd=sum;//转换为二进制后的最后一个元素的位置。
//如(10)10=(1010)2最后一个元素的位置为三。
    for(int i=0;i<=sum;++i)
    {
        e[js]=zs[i];
        js--;
    }
}

int main() {
    long long a,b;
    cin>>a>>b;
    zh(b);//将b转换为二进制。
    cout<<quickpow(a,e);
    return 0;
}

代码:

//省略...... 
long long quickpow(long long a,long long b)
{
    long long ans=1,base=a;
    while(b!=0)
    {
        if(b&1!=0) ans*=base;    
        base*=base;
        b>>=1;    //将b的二进制数向右移一位(相当于将b的二进制数的最后一位抹掉。)
    }
    return ans;
}

 

PS:不用位运算的代码当指数为零时需要特判!

注意:因为是乘方运算所以很有可能会爆long long!

input:

2 11

output:

2048

先讲一下(&、>>)位运算.

&:‘&’叫做按位与。作用:把参与运算的两个数对应的二进制相与,只有对应的二进制均为1时,结果(应该也是二进制的形式)的对应位才为1,否则为0。

>>:'>>'叫做右移。作用:把“>>”左边的运算数的各二进制位全部右移若干位(“>>”右边的那个数)。

以此样例讲一下吧。

(11)10=(1011)2。

如何将二进制转换为十进制那?

酱紫,1*2+1*21 (+0*22) +1*23

∴211=2(1*2+1*21 (+0*22) +1*23)。

小学我们学过 an*am=an+m

∴211=21*22*28

快速幂就是这样计算的!

模拟一下样例:

ans=1,base=2。

11的二进制数为1011,不为0 进行循环直到为0。

1011的最后一位为1,ans*base。

若不为1,就不进行ans*base。

base*base,就是由2变成了4(2^2)。

1011抹去最后一位直到为0.

就是酱紫。

 

//转载来自这里

转载于:https://www.cnblogs.com/skkyk/p/10872266.html

### 回答1: 快速幂是一种用于快速计算幂运算的算法,其基本思想是将指数进行二进制拆分,然后利用指数的二进制表示来快速计算幂运算。在计算过程中,可以利用取余运算来避免数值溢出,提高计算效率。快速幂算法的时间复杂度为O(logn)。 具体实现时,可以使用递归或循环的方式来实现快速幂算法。在递归实现中,需要注意处理指数为负数的情况。在循环实现中,需要注意处理指数为0的情况。 取余运算可以使用%运算符来实现,其含义是求两个数相除的余数。在快速幂算法中,取余运算可以避免数值溢出,提高计算效率。需要注意的是,在取余运算中,除数不能为0。 综上所述,快速幂算法和取余运算是计算幂运算时常用的算法和运算符,能够提高计算效率,避免数值溢出。 ### 回答2: 快速幂算法是一种优化指数运算的算法,通常用于对大整数进行多次乘方运算。该算法的基本思想是将指数拆分成二进制的形式,然后利用指数的二进制表示逐步计算。 具体来说,假设要计算a^b mod c的值,其中a、b、c均为正整数,那么可以先将b转换为二进制的形式,然后从右往左遍历这个二进制数,每次将当前位的值乘到结果中,同时对结果取模,然后将底数a自乘一次,且也要对结果取模。最终得到的结果就是a^b mod c的值。 例如,假设要计算3^13 mod 7的值,将13转换为二进制的形式得到1101,从右往左遍历这个二进制数,开始时结果为1,底数为3,当前位是1,那么将3乘到结果中,并对结果取模得到3,底数自乘得到9 mod 7 = 2;下一位是0,直接将底数自乘,即2*2 mod 7 = 4;再下一位是1,将底数自乘得到16 mod 7 = 2,同时将2乘入结果,结果为3×2 mod 7 = 6;最后一位是1,将底数自乘得到4 mod 7 = 4,同时将4乘入结果,结果为6×4 mod 7 = 3,因此3^13 mod 7的值为3。 快速幂算法的优点是可以快速地计算指数运算,具有较好的时间复杂度。同时,取模运算的存在可以避免产生过多的中间结果,节省了空间复杂度。然而,快速幂算法的缺点是需要将指数转换为二进制形式,这可能会增加算法的编程难度。 ### 回答3: 快速幂是一种用于求解幂运算的快速算法。在进行取余运算时,快速幂算法能够通过对结果取模,使得计算结果更为精确。在计算大数据的幂的运算时,常常可以使用快速幂的算法来进行加速运算。 快速幂的算法可以使用递归的方式实现,也可以使用循环的方式实现。递归实现的代码比较简单,但是存在栈空间过大的问题;循环实现的代码虽然有一定的难度,但是能够避免栈空间过大的问题。 在进行取余运算时,我们需要注意的是,如果运算的两个数都很大,那么我们在计算结果时需要特别小心。因为如果直接进行计算,可能会导致数据类型溢出,进而产生错误的结果。为了避免这种情况,我们可以在进行计算时,对结果进行取模处理。 在进行取模运算时,我们需要使用取模定理,也就是(a*b)%p=(a%p)*(b%p)%p。通过这种方式,可以使得计算结果更为精确,也可以避免数据类型溢出的情况发生。如果无法使用取模定理,则需要使用高精度的算法进行取余运算。 总而言之,快速幂算法是一种非常有效的幂运算算法,可以快速地计算出大数据的幂运算结果。在进行取余运算时,需要特别注意数据类型溢出的问题,在进行计算时需要特别小心。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值