【发布时间】:2014-12-07 00:44:50
【问题描述】:
我正在寻找一种方法来找到一系列数字的模,例如: (a1 + a2 + a3 + a4 + ... + an) mod x
是否有任何模函数的方式/属性,以便我可以从序列中的单个数字模数计算该序列的模数。
【问题讨论】:
-
你知道 (a + b) % x == ((a%x) + (b%x)) % x 对吧?
-
我也有同样的问题。你找到答案了吗?
我正在寻找一种方法来找到一系列数字的模,例如: (a1 + a2 + a3 + a4 + ... + an) mod x
是否有任何模函数的方式/属性,以便我可以从序列中的单个数字模数计算该序列的模数。
【问题讨论】:
Mod 运算符是可分配的;
( x + y ) % z
... 等价于:
( x % z + y % z ) % z
【讨论】:
我记得。你可以:
(a1 mod x + a2 mod x + a3 mod x + ... + an mod x) mod x
这样的等式将有利于一个目的。如果数字的总和超过了用于求和的变量的容量。前任。 32位整数。
这样,模数的总和很可能适合用于求和的 var。取决于 x 值和序列长度。
示例代码
int sum = 0;
for (int i=0;i<n;i++)
sum += a[i] % x;
int mod = sum % x;
更好的方法(不太确定)
int sum = 0;
for (int i=0;i<n;i++) {
sum += a[i] % x;
sum %= x;
}
int mod = sum;
【讨论】:
因为这样做的目的通常是为了避免溢出, 当我们对所有 mod 值求和时,以下内容可能仍会溢出。
如果我们想避免溢出,方法错误:
(a1 mod x + a2 mod x + a3 mod x + ... + an mod x) mod x
我们需要在每个总和之后进行修改。
假设 ai
((((a1 + a2) mod x) + a3) mod x) + a4) mod x ....
应该避免溢出。
【讨论】: