Создайте функцию, похожую на modulo, которая также работает с отрицательными числами

#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 может принимать практически любое значение, так что это не сработает, но в любом случае спасибо!