2013-11-22 1 views
3

Algorithm вопрос:алгоритм, чтобы определить, является ли значение в диапазоне кратного

Скажем, я хочу, чтобы определить, является ли значение в пределах диапазона (например, 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 

Это работает, но это неудобно.

Я пропустил более интуитивный/лаконичный алгоритм здесь?

+1

Почему вы не можете просто взять значение mod 10, а затем проверить, является ли ответ 10-range if> 5. –

+0

@Abhishek - Я предварительно (локально) работает с алгоритмом, который по существу делает что - и согласился, в конечном счете яснее объяснять/комментировать. Однако мои аргументы в пользу публикации этой темы были на всякий случай, когда я пропустил более глубокую/более мощную концепцию, которая выполняла то же самое, как в общем, так и в Python. – DreadPirateShawn

+0

Кроме того, не стесняйтесь публиковать свое предложение в качестве ответа - если это остается самым ясным путем, я хотел бы отметить его как выбранный ответ. – DreadPirateShawn

ответ

7

Я считаю это решение легче понять:

remainder = (value % cycle) 
(remainder <= range) || (cycle - remainder) <= range 

В принципе я считаю, остаток value я искать в отношении по модулю (cycle), а затем проверить, если он находится в пределах ожидаемого диапазона.

Альтернатива:

Альтернативное решение (делает по существу то же самое) будет:

remainder = (value % cycle) 
min(remainder, cycle - remainder) <= range 

Вы можете выбрать любой из двух решений вам больше нравится.

Примечание Этот алгоритм работает, если дословно range < cycle. В других случаях ответ всегда верен.

+0

Тот, с которым я пришел, был (остаток <= диапазон) || (остаток> = (диапазон циклов)). Для цикла 10 и диапазона 2 он создаст условный остаток <= 2 || остаток> = 8 && остаток <10. С остатком <10 подразумевается операция модуля. – JustinDanielson

+0

Большая обязанность. Мне очень нравится подход. Меньше вычислений, таким образом, меньше, чтобы комментировать/поддерживать. – DreadPirateShawn

+0

Также - вопрос (и, таким образом, ответ) был прокомментирован в моем коде для справки, поэтому вероятнее будет больше хитов/голосов в будущем. – DreadPirateShawn

Смежные вопросы