算法问题:
假设我想确定一个值是否在十几倍的范围内(例如2) – 所以,8-12,18-22,28-32等.
我目前的解决方案是将范围添加到值,mod乘以10,然后重新减去范围 – 从而留下-2到8的东西 – 然后检查绝对值是否小于所需范围.
value = 38
range = 2
cycle = 10
tweaked_mod = ((value + range) % cycle) - range
# tweaked_mod = -2
within_range = (abs(tweaked_mod) <= range)
# within_range = True
与:
value = 37
range = 2
cycle = 10
tweaked_mod = ((value + range) % cycle) - range
# tweaked_mod = 7
within_range = (abs(tweaked_mod) <= range)
# within_range = False
它有效,但很尴尬.
我在这里错过了一个更直观/简洁的算法吗?
最佳答案 我发现这个解决方案更容易理解:
remainder = (value % cycle)
(remainder <= range) || (cycle - remainder) <= range
基本上我找到了我在模数(循环)方面搜索的剩余值,然后检查它是否在预期范围内.
替代方案:
另一种解决方案(基本上是相同的)将是:
remainder = (value % cycle)
min(remainder, cycle - remainder) <= range
您可以自由选择您更喜欢的两种解决方案中的任何一种.
注意如果范围<1,则该算法逐字工作.周期.在其他情况下,答案总是如此.