高级语言程序设计 快速幂

快速幂(平方求幂)是一种简单而有效的算法,它可以以O(logn)的时间复杂度计算乘方。效率挺高

比如:计算710。

高级语言程序设计 快速幂_第1张图片

高级语言程序设计 快速幂_第2张图片

 我们很自然地可以得到一个递归方程高级语言程序设计 快速幂_第3张图片

计算a的n次方,如果n是偶数(不为0),那么就先计算a的n/2次方,然后平方;如果n是奇数,就先计算a的n-1次方(n-1为偶数),再乘上a;递归出口是a的0次方为1。

#include 

using namespace std;

int qpow(int a,int n)
{
    if(n==0)
    return 1;
    else if(n%2==1)
    return qpow(a,n-1)*a;
    else
    {
        int temp =qpow(a,n/2);
        return temp *temp;
    }
}

 注意:这个temp变量是必要的,因为如果不把记录下来,直接写成qpow(a, n /2)*qpow(a, n /2),那会计算两次,整个算法就退化为了 O(n)。

在实际问题中,计算结果可能会非常巨大,高精度又没有必要,此时要对一个大素数取模。这时我们的快速幂也应当进行取模,此时应当注意:原则是步步取模,如果MOD较大,还应当开long long。

#define MOD 1000000007
typedef long long ll;
ll qpow(ll a, ll n)
{
    if (n == 0)
        return 1;
    else if (n % 2 == 1)
        return qpow(a, n - 1) * a % MOD;
    else
    {
        ll temp = qpow(a, n / 2) % MOD;
        return temp * temp % MOD;
    }
}

你可能感兴趣的:(算法)