1.代码存在的意义
在进行较大的幂运算时,用暴力累乘会导致整个程序的响应时间较长。而进行快速幂运算则可以优化这个过程,使得进行较大数据的运算时响应较快.
2.代码的原理
正常暴力幂运算为:
快速幂运算:
1:当n为偶数时:
2:当n为奇数时: 则中的n-1为偶数,即可以将代入1.中
3:当n为1时:
3.代码实现
那么我们不难看出要实现上述功能需要通过递归函数来实现.
int Quickm(int a, int n)
{
if (n == 1)return a;
if (n % 2 == 0)return Quickm(a*a, n / 2); //a^n=(a*a)^(n/2)
else return a * Quickm(a, n - 1);
}
假如题目所需的数据较大则可以更改函数返回类型(long long int),来扩大可以计算的范围.
4.假如进行较大的幂运算后还需要对其进行取模运算
取模运算规则:
1. (a + b) % p = (a % p + b % p) % p
2. (a - b) % p = (a % p - b % p) % p
3. (a * b) % p = (a % p * b % p) % p
4. a ^ b % p = ((a % p)^b) % p
显然我们需要用第四个规则来计算:
int Quickmod(int a, int n,int mod)
{
if (n == 1)return a;
if (n % 2 == 0)return Quickmod((a*a) % mod, n / 2,mod) % mod;
else return a * Quickmod(a, n - 1,mod) % mod;
}
总代码
#include<iostream>
using namespace std;
int Quickmod(int a, int n,int mod)
{
if (n == 1)return a;
if (n % 2 == 0)return Quickmod((a*a) % mod, n / 2,mod) % mod;
else return a * Quickmod(a, n - 1,mod) % mod;
}
int Quickm(int a, int n)
{
if (n == 1)return a;
if (n % 2 == 0)return Quickm((a * a), n / 2);
else return a * Quickm(a, n - 1);
}
int main()
{
int a, n;
cin >> a >> n;
cout << Quickm(a, n) << endl;
}
可以按需更改函数返回类型.