我们有两个整数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;
}
请解释一下这背后的逻辑。我知道模数学的基本属性。
感谢。
答案 0 :(得分:3)
如果您了解模块化算术,很容易弄明白,表达式(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
,这就是您的算法所做的。
为了证明他们的平等,我们可以在第二个表达式中a
之前计算系数模b[i]
,很容易看出,对于b[i]
,将会有n - i
1}}次我们必须将它乘以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
,因此它们等于模{{ {1}}。
a
是48
数字的字符代码,因此0
是从char转换为数字。
答案 1 :(得分:1)
基本上这个函数实现Horner's Algorithm来计算b
的十进制值。
正如@Predelnik解释的那样,b
的值是一个多项式,其系数是b
的数字,变量x
是10
。该函数使用modulo与加法和乘法兼容的事实计算每次迭代的模数:
(a+b) % c = ((a%c) + (b%c)) % c
(a*b) % c = ((a%c) * (b%c)) % c