b%a,其中b非常大

b%a where b is very large

本文关键字:非常 其中 b%a      更新时间:2023-10-16

我们得到两个整数aba <= 100000b < 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

480数字的字符代码,因此(b[i] - 48)是从字符到数字的转换。

基本上这个函数实现了霍纳算法来计算b的十进制值。

如@Predelnik所述,b的值是一个多项式,其系数是b的数字,变量x10。该函数使用模与加法和乘法兼容的事实计算每次迭代时的模数:

(a+b) % c = ((a%c) + (b%c)) % c
(a*b) % c = ((a%c) * (b%c)) % c