#math #modulo
#математика #modulo
Вопрос:
Мне нужно создать функцию f(a,b)
, которая даст следующие результаты:
f(0, 3) = 0
f(1, 3) = 1
f(2, 3) = 2
f(3, 3) = 0
f(4, 3) = 1... (this works exactly like a%b)
Однако она также должна следовать этому шаблону для отрицательных чисел:
f(-4, 3) = 2
f(-3, 3) = 0
f(-2, 3) = 1
f(-1, 3) = 2
f( 0, 3) = 0
В настоящее время я нашел это решение:
x = a % b
return a < 0 amp;amp; mod != 0 ? mod b : mod;
Однако это кажется слишком сложным и медленным для того, чего я пытаюсь достичь. Нет ли более простого способа сгенерировать последовательность, подобную modulo, которая продолжается для отрицательных значений?
Ответ №1:
Поведение операции по модулю зависит от языка программирования — смотрите таблицу здесь
Например, в Python print(-4 % 3)
дает 2
Кажется, вы используете C-подобный язык, где остаток имеет тот же знак, что и dividend. В этом случае вы можете использовать такую формулу (ideone)
(a % b b) % b
Также единственного сравнения достаточно для исправления отрицательного значения (чтобы избежать двойного %
)
rem = a % b;
if (rem < 0) rem = b;
Комментарии:
1. Действительно, я использовал Java, не знал, что поведение modulo изменилось! (a % b b) % b — это именно то решение, которое я хотел, оно намного чище. Спасибо 🙂
Ответ №2:
Это не общее решение для любого b
, но если вам нужно просто обернуть массив с обеих сторон, и вы уменьшаете индекс на 1 (или максимум a
), допустимым и даже более коротким решением для любого b &&t;= -a
является:
(a b) % b
Комментарии:
1. В моем случае a может принимать практически любое значение, так что это не сработает, но в любом случае спасибо!