用于确定 A 是否在 B 的倍数的 X 内的算法

  • 本文关键字:算法 是否 用于 algorithm
  • 更新时间 :
  • 英文 :


这不是特定于语言的,但我不太擅长数学!

测试 A 是否在 B 的倍数的 X 范围内的最有效方法是什么? 我目前使用的方法是:

# when (A mod B) < (B/2)
if (A modulus B) < X THEN TRUE
# when (A mod B) > (B/2)
if ABS((A modulus B) - B) < X THEN TRUE

示例 1:A 比 3 x B 多 100

A=30100
B=10000
X=150
(30100 mod 10000) = 100 < (10000/2)
(30100 modulus 10000) = 100

示例 2:A 小于 100 x B

A=29900
B=10000
X=150
(29900 mod 10000) = 9900 > (10000/2)
ABS((29900 modulus 10000) - 10000) = 100

有没有更好的方法可以做到这一点?

(为了避免 XY 问题:我正在编写一个脚本来监视某些工业机械,并且我想在生命周期计数器指标在定期维护值范围内时触发警报。当服务间隔为 10000 且警报范围为 150 时,我想知道该计数器何时在 9850 和 10150 之间,或 19850 和 20150 之间,等等(

你的方式还不错,但做起来更快一点:

if ((A + X) % B) <= X*2 then
TRUE
else
FALSE

这是距离 <= X。 如果您需要

if ((A + X + B - 1) % B) <= X*2-2 then
TRUE
else
FALSE

请注意,A + X + B - 1就像A + X - 1,但在 X == 0 的情况下,您的语言可能会对模运算符和负操作数产生任何奇怪的影响。

我认为最好的方法是你认为最清楚的;但就我个人而言,我会写相当于((A + X( MOD B ≤ 2X(。例如,在C/Java/Perl/JavaScript/etc中:

if ((a + x) % b <= 2 * x) {
// A is within X of a multiple of B
}