📅  最后修改于: 2023-12-03 15:27:53.309000             🧑  作者: Mango
在进行数值计算时,很多情况下需要对数字进行模幂运算。如果数字本身很大,使用内置的数据类型(如int或double)就会面临数值溢出的问题。因此,我们往往需要使用字符串来表示这些大量数字,并进行模幂运算。
给定三个字符串a、b、c,表示三个非负整数,计算a^b mod c。其中,a、b、c的长度均不超过10^6。
对于较小的数字,我们可以使用内置数据类型和算术运算符完成模幂运算。但当数字非常大时,我们需要使用更高效的算法。
常见的算法有二分法、快速幂算法等。这里我们介绍快速幂算法。快速幂算法的基本思想是将指数b转化为二进制形式,并利用乘方运算符的结合律通过递归的方式进行计算。
具体实现如下:
// 快速幂算法
string fast_pow(string a, string b, string c) {
// 计算ab mod c
int len_b = b.length();
int r = 1;
for (int i = len_b - 1; i >= 0; i--) {
int bit = b[i] - '0';
if (bit == 1) {
r = (r * stoi(a)) % stoi(c);
}
a = to_string((stoi(a) * stoi(a)) % stoi(c));
}
return to_string(r);
}
通过对比常规算法和快速幂算法的运行时间,可以发现快速幂算法的速度远远高于常规算法。
在计算大量数字的模幂时,使用快速幂算法是一个高效的选择。
[1] 陈越等. 数据结构[M]. 清华大学出版社, 2004.
[2] 《算法竞赛进阶指南》. 读书笔记. 2020.
[3] https://www.geeksforgeeks.org/modular-exponentiation-power-in-modular-arithmetic/