Про разные подходы

В математике «поделить a на b с остатком» означает «найти такие числа q и r, что будет выполняться равенство b*q + r = a».

  • a - делимое;
  • b - делитель;
  • q - неполное частное;
  • r - остаток.

Например:

11 / 4 = 2, остаток 3.
4 * 2 + 3 = 11

7 / 2 = 3, остаток 1.
2 * 3 + 1 = 7

14 / 5 = 2, остаток 4.
5 * 2 + 4 = 14

А если остаток отрицательный?

В математике принято считать, что остаток должен быть неотрицательным, то есть должно выполняться неравенство 0 <= r < b. Но ведь физически никто не мешает нам сделать так:

11 / 4 = 2, остаток 3
11 / 4 = 3, остаток -1

Равенство b*q + r = a по-прежнему выполняется, а остаток по модулю по-прежнему меньше делителя.

Конечно, если делимое и делитель положительные, то такой выбор остатка выглядит странновато. Но давайте поработаем с отрицательными числами:

11 / -4 = -2, остаток 3
11 / -4 = -3, остаток -1

Какой из этих вариантов правильный? На самом деле, оба. Просто существуют разные подходы к делению с остатком:

  • деление с округлением к нулю;
  • деление с округлением вниз;
  • евклидово деление (привычное, как в математике).

Деление с округлением к нулю

«Округлить a к нулю» означает взять первое целое число, которое идёт на числовой прямой сразу после a по направлению к нулю.

  • округлить к нулю 3.4: получим 3;
  • округлить к нулю -3.4: получим -3.

Truncate division

Давайте поделим 11 на -4 и -11 на 4. В обоих случаях получится -2.75. Если округлить к нулю, то будет -2.

Теперь посчитаем остаток. Из формулы b*q + r = a выводится, что r = a - b*q. В первом случае: r = 11 - (-4)*(-2) = 11 - 8 = 3, во втором случае: r = -11 - 4*(-2) = -11 - (-8) = -3.

То есть если мы округляем результат деления к нулю, то получаем следующую картину:

11 / -4 = -2, остаток 3
-11 / 4 = -2, остаток -3

При делении с округлением к нулю знак остатка всегда совпадает со знаком делимого, а от знака делителя вообще никак не зависит.

Деление с округлением вниз

«Округлить a вниз» означает взять первое целое число, которое идёт на числовой прямой сразу после a по направлению к минус бесконечности.

  • округлить вниз 3.4: получим 3;
  • округлить вниз -3.4: получим -4.

Floored division

Если мы округляем результат деления вниз, то получаем следующую картину:

11 / -4 = -3, остаток -1
-11 / 4 = -3, остаток 1

Теперь знак остатка совпадает со знаком делителя, а от знака делимого не зависит.

Евклидово деление

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

11 / -4 = -2, остаток 3
-11 / 4 = -3, остаток 1