Как насчет
if (a > 0)
return a % n;
if (a < 0)
{
r = n - (-a % n);
if (r == n)
return 0;
return r;
}
Если a <0, то <code>r = -a % n - это значение в [0, n), такое что k * n + r = -a для некоторого целого числа k.
Тогда n - r является значением в (0, n], и, поскольку -r = a + k * n, мы имеем n - r = a + (k + 1) * n или a = (n - r) + (-k - 1) * n. Из этого вы можете видеть, что n - r является модулем a, и поскольку оно находится в (0, n], оно неотрицательно.
Наконец, вы хотите, чтобы результат был в диапазоне [0, n), а не в (0, n]. Чтобы убедиться в этом, мы проверяем, если r равно n, и если да, возвращаем 0. (который имеет модуль курса-n-эквивалентный n)