Подтвердить что ты не робот

Математический модуль в С#

Существует ли библиотечная функция в С# для математического модуля числа - этим я специально подразумеваю, что отрицательное целое число по модулю положительного целого должно давать положительный результат.

отредактирован, чтобы предоставить пример:

-5 modulo 3 должен возвращать 1

4b9b3361

Ответ 1

Попробуйте (a % b) * Math.Sign(a)

Попробуйте это; он работает правильно.

static int MathMod(int a, int b) {
    return (Math.Abs(a * b) + a) % b;
}

Ответ 2

x < 0 ? ((x % m) + m) % m : x % m;

Ответ 3

Ну, определение (если я не ошибаюсь) - это что-то вроде этого

a mod b = a - b * floor (a/b)

Вероятно, он довольно медленный и остерегайтесь целочисленного деления, как встроенный модуль:)

Другой вариант - изменить результат встроенного модуля в соответствии с признаками операндов. Что-то вроде этого:

if(a < 0 && b > 0)
{
    return (a % b + b) % b;
}
else if ....

Ответ 4

a < 0 ? ((a+1)%b + b-1) : (a%b);

Для этого требуется только одна операция% (and one ternary op) и без умножения

Ответ 5

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

т.е.

если -5 % 2 = -1 и -5 / 2 = -2, и если вам нужно это -5 / 2 * 2 + -5 % 2 = -5, то при вычислении -5 % 2 = 1 вы также вычисляете -5 / 2 = -3.

Ответ 6

Вы можете написать свой собственный, как Math.Abs(x % y);

Ответ 7

Исправление:

(ans = a% b) < 0? (a < 0 & b < 0 & alpha; (ans-b)% (- b): (ans + b)% b): ans

Ответ 8

Я знаю, что вопрос не просил об этом, но я просто написал и протестировал метод, который также возвращает фактор. Не нашел этого, когда я искал его, поэтому я подумал, что я его выложил.

/// <summary>
/// Compute integer quotient and remainder of <paramref name="dividend"/> / <paramref name="divisor"/>
/// where the <paramref name="remainder"/> has the same sign as <paramref name="divisor"/>, and is
/// between zero (inclusive) and the <paramref name="divisor"/> (exclusive). As always,
/// (quotientResult * <paramref name="divisor"/> + <paramref name="remainder"/> == <paramref name="dividend"/>).
/// </summary>
public static int DivRemPeriodic(int dividend, int divisor, out int remainder) {
    var quotient = Math.DivRem(dividend, divisor, out remainder);
    if (divisor > 0 ? remainder < 0 : remainder > 0) {
        remainder += divisor;
        quotient -= 1;
    }
    return quotient;
}