C++ 中的快速幂(Fast Power)算法是一种用于计算大数幂的高效方法。传统方法直接计算 a^n
需要进行 n-1
次乘法操作,但对于大数或 n
非常大时,这样的方法会非常耗时。快速幂算法基于分治策略和二进制表示,将乘法次数降低到 O(log n)
。
让我们看一个例子:5^16
有人就会说:“啊,这也太简单了,循环就解决了。”
那我问你,5^100000000000000你用循环解决需要几秒?我劝你别尝试
众所周知:
5^16
=5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5
= (5*5)*(5*5)*(5*5)*(5*5)*(5*5)*(5*5)*(5*5)*(5*5)
=25^8
以此类推:
=625*4
=390625*2
=781250
所以,你知道怎么做了吧
以下是快速幂算法的基本思路:
- 将指数
n
转换为二进制形式。 - 初始化结果
res = 1
和底数base = a
。 - 从右到左扫描
n
的二进制位(即n & 1
,n >>= 1
):- 如果当前位为
1
,则res *= base
。 - 将
base
平方(即base *= base
)。 - 将
n
右移一位(即n >>= 1
)。
- 如果当前位为
- 返回
res
。
下面是一个小模板:
#include<iostream>
using namespace std;
long long fpow(long long a,long long b){
long long ans=1;
while(b){
if(b&1)ans*=a;
b>>=1;
a*=a;
}
return ans;
}
int main(){
long long n,m;
cin>>n>>m;
cout<<fpow(n,m)<<endl;
}
下面是 C++ 代码实现:
#include <iostream>
using namespace std;
// 快速幂函数
long long fastPower(long long base, long long exponent, long long mod = -1) {
long long res = 1;
base = base % mod; // 如果需要取模,则先对底数取模
while (exponent > 0) {
// 如果当前位为1,则累乘
if (exponent % 2 == 1) {
res = (res * base) % mod; // 如果需要取模,则进行取模操作
}
// 底数平方
base = (base * base) % mod; // 如果需要取模,则进行取模操作
// 指数右移一位
exponent = exponent >> 1;
}
return res;
}
int main() {
long long a = 2;
long long n = 10;
cout << "2^10 = " << fastPower(a, n) << endl;
// 示例:计算 (2^10) % 1000000007
cout << "2^10 mod 1000000007 = " << fastPower(a, n, 1000000007) << endl;
return 0;
}
在这个代码中,我们还增加了一个 mod
参数来支持模幂运算,这在编程中非常常见,特别是当结果非常大或需要遵循某个特定模数时。如果 mod
参数被省略或为负数,则不执行模运算。