b%a,其中b非常大
b%a where b is very large
我们得到两个整数a
和b
,a <= 100000
,b < 10^250
。我想计算 b%a。我找到了这个算法,但无法弄清楚它是如何工作的。
int mod(int a, char b[])
{
int r = 0;
int i;
for(i=0;b[i];++i)
{
r=10*r +(b[i] - 48);
r = r % a;
}
return r;
}
请解释这背后的逻辑。我知道模数学的基本性质。
谢谢。
很容易
弄清楚您是否知道模算术,表达式(b[n] + 10 * b[n - 1] + ... + 10^k * b[k] + ... + 10^n * b[0]) modulo a
在技术上是初始问题陈述,可以简化为(...((b[0] modulo a) * 10 + b[1]) modulo a) * 10 + ... + b[n]) modulo a
这就是您的算法所做的。
为了证明它们相等,我们可以在第二个表达式中计算b[i]
之前的系数模a
,很容易看出,对于b[i]
,我们必须正好有 n - i
次必须将其乘以 10(最后一个n
将乘以 0 倍,他前面的那个将乘以 1 次,依此类推......因此,模a
等于10 ^ (n - i)
,这是第一个表达式中b[i]
之前的相同系数。
因此,由于两个表达式中b[i]
之前的所有系数都是相等的,因此很明显,两个表达式都等于(k_0 * b[0] + k_1 * b[1] ... + k_n * b[n])
模a
,因此它们是相等的模a
。
48
是0
数字的字符代码,因此(b[i] - 48)
是从字符到数字的转换。
基本上这个函数实现了霍纳算法来计算b
的十进制值。
如@Predelnik所述,b
的值是一个多项式,其系数是b
的数字,变量x
是10
。该函数使用模与加法和乘法兼容的事实计算每次迭代时的模数:
(a+b) % c = ((a%c) + (b%c)) % c
(a*b) % c = ((a%c) * (b%c)) % c
相关文章:
- OpenGL大的3D纹理(>2GB)非常慢
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 其中降频广播实际上是有用的
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 使用浮点数和双精度数的非常小数字的数学
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 容器,其中每个项可以有多个非唯一键 (c++17)
- 在打开多个其他窗口时使用全屏窗口时帧速率非常低
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 我从int x[3]得到的一个非常奇怪的输出;
- 初始化向量数组,其中每个向量的大小为 0
- 创建具有两个视口的Qt3D C++场景,其中显示适当的不同网格
- 反向迭代器在C++中非常奇怪的行为
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 如何定义自定义生成配置类型,其中通常是.exe的目标改为 DLL
- b%a,其中b非常大
- 将十进制转换为二进制,并计算其中的数字非常非常大
- 数字的组成,其中数字非常大