b%a其中b非常大

时间:2015-04-07 10:34:49

标签: c++ modulus largenumber

我们有两个整数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;
}

请解释一下这背后的逻辑。我知道模数学的基本属性。

感谢。

2 个答案:

答案 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}}。

a48数字的字符代码,因此0是从char转换为数字。

答案 1 :(得分:1)

基本上这个函数实现Horner's Algorithm来计算b的十进制值。

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

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