Математический модуль в c#
есть ли библиотечная функция в C# для математического модуля числа - под этим я специально подразумеваю, что отрицательное целое число по модулю положительного целого должно давать положительный результат.
отредактировано, чтобы привести пример:
-5 по модулю 3 должно возвращать 1
9 ответов
попробовать (a % b) * Math.Sign(a)
попробуйте, это работает правильно.
static int MathMod(int a, int b) {
return (Math.Abs(a * b) + a) % b;
}
Ну определение (если я не ошибаюсь) что-то вроде этого
a mod b = A-b * floor (a/b)
Это, вероятно, довольно медленно и остерегайтесь целочисленного деления, как встроенный модуль:)
другой вариант-изменить результат встроенного модуля в соответствии со знаками операндов. Что-то вроде этого:--2-->
if(a < 0 && b > 0)
{
return (a % b + b) % b;
}
else if ....
a < 0 ? ((a+1)%b + b-1) : (a%b);
для этого требуется только одна операция % (and one ternary op
), а не умножение
если вы используете любой из этих алгоритмов, и Вам также нужно сделать деление, не забудьте убедиться, что вычитаете 1, когда это необходимо.
то есть,
если -5 % 2 = -1
и -5 / 2 = -2
, и если вы заботитесь, что -5 / 2 * 2 + -5 % 2 = -5
, то при расчете -5 % 2 = 1
, что также расчета -5 / 2 = -3
.
Я знаю, что вопрос не просил об этом, но я просто написал и протестировал метод, который также возвращает фактор. Я не нашел его, когда искал, поэтому решил положить его туда.
/// <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;
}