0
点赞
收藏
分享

微信扫一扫

快速幂及取模

两岁时就很帅 2022-02-05 阅读 98
蓝桥杯c++

思想:二分,时间复杂度O(log n)

例 : 普通计算2 的 10 次幂 2*2*2*2....*2是O(n)时间复杂度

快速幂 通过平方求幂,

2的平方得   2的2次幂 

2的2次幂  再平方    得2的四次幂

2的四次幂  再 乘2 得 2的五次幂

然后2的五次幂再平方得2的10次幂

得递归表达式:

当n为偶数, 计算2的n/2次幂 再相乘

n为奇数 计算2的n-1次幂 再乘2

n为0 答案为1

#include <iostream>
using namespace std;
//int k=7;
int ebs(int x,int n)
{
    if(n==0)
    {
        return 1;
    }
    else if(n%2==1)
    {
        return ebs(x,n-1)*x;
    }
    else
    {
        int tmp=ebs(x,n/2);  //不能写成ebs(x,n/2)*ebs(x,n/2) 否则计算两次ebs(x,n/2)
        return tmp*tmp;      //时间复杂度变为O(n)  
    }
}
int main ()
{
    int n,m;  计算n的m次幂
    cin>>n>>m;
    int res=ebs(n,m);
    cout<<res;
    return 0;
}

当需要取模时只要再原代码中略微修改,步步取模即可

#include <iostream>
using namespace std;
int k=7;  //此处结果对7取模
int ebs(int x,int n)
{
    if(n==0)
    {
        return 1;
    }
    else if(n%2==1)
    {
        return ebs(x,n-1)*x%k;
    }
    else
    {
        int tmp=ebs(x,n/2)%k;
        return tmp*tmp%k;
    }
}
int main ()
{
    int n,m;
    cin>>n>>m;
    int res=ebs(n,m);
    cout<<res;
    return 0;
}
举报

相关推荐

0 条评论