对大数进行求余操作,这里只涉及给定一个大数,针对给定的 mod 值采用模拟手算的方法进行求余操作

模拟手算

原理:从字符串 large_num 首位开始对 mod 进行取余操作,并将余数 result 存起来与后一位合到一起继续进行取余操作,直到遍历完整个字符串得到最终余数

核心代码:

1
2
3
4
5
long long result = 0;
for (int i = 0; i < large_num.size(); i++)
{
result = (result * 10 + large_num[i] - '0') % mod;
}

模拟手算(优化版)

原理:在模拟手算基础上,将大数进行分块,每块含多位数字,每次对块进行取余操作,并将余数 result 存起来与后一块合到一起继续进行取余操作,直到遍历完所有得到最终余数

核心代码:

1
2
3
4
5
6
7
8
9
int k_size = 9;
long long result = 0;
string segment;
for (size_t i = 0; i < large_num.size(); i += k_size)
{
int offset = min(k_size, static_cast<int>(large_num.size() - i));
segment = large_num.substr(i, offset);
result = (result * static_cast<long long>(pow(10, segment.size())) + stoi(segment)) % mod;
}

参考:
如何计算大数对某个数求余
高精度大数(超 long long)取余原理及模板 - cheems~ - 博客园
c 语言如何求大数的余数 | PingCode 智库