目录
为什么要用快速幂
对于比较大的平方数,采用常规方法,时间复杂度过高,程序经常超时。采用快速幂可以轻松解决问题。
过程解释
例如计算2^100000000,先将pow(平方)除2,将base(底数)平方,不断重复此过程,最后让pow变成0,如果遇到奇数,就pow--,再将pow分离一个出来与base相乘,这样即可计算出2^100000000。
C++代码实现
例题
题目描述
求 a 的 b 次方对 p 取模的值,其中 1≤a,b,p≤10^9
输入
三个用空格隔开的整数a,b和p。
输出
一个整数,表示ab mod p的值。
样例输入
2 3 9样例输出
8
初步思路
#include<iostream>
using namespace std;
int fastPower(int base, int pow, int rem)
{
// base是底数,pow是平方数,rem是取模数
int ans = 1;
while (pow > 0)
{
if (pow % 2 == 0) // 假如pow为偶数
{
pow /= 2;
base = base * base % rem;
}
else // 假如pow为奇数
{
pow--;
ans = ans * base % rem;
}
}
return ans;
}
int main()
{
int a, b, c;
cin >> a >> b >> c;
cout << fastPower(a, b, c);
return 0;
}
进一步简化
#include<iostream>
using namespace std;
int fastPower(int base, int pow, int rem)
{
// base是底数,pow是平方数,rem是取模数
int ans = 1;
while (pow > 0)
{
if (pow % 2 == 1) // 假如pow为奇数
{
pow--;
ans = ans * base % rem;
}
pow /= 2;
base = base * base % rem;
}
return ans;
}
int main()
{
int a, b, c;
cin >> a >> b >> c;
cout << fastPower(a, b, c);
return 0;
}
最简代码
#include<iostream>
using namespace std;
int fastPower(int base, int pow, int rem)
// base为底数,pow为平方数,rem为取余的数
{
int ans = 1;
while (pow > 0)
{ // 此处相当于pow % 2 == 1
if (pow & 1) // 二进制转化,偶数最后一位为0,奇数最后一位为1
{
ans = ans * base % rem;
}
pow >>= 1; // 二进制换位,代替了pow /= 2
base = base * base % rem;
}
return ans;
}
int main()
{
int a, b, c;
cin >> a >> b >> c;
cout << fastPower(a, b, c);
return 0;
}