c#中的数学模数

时间:2010-04-22 13:10:49

标签: c# modulo

c#中是否有一个库函数用于数字的数学模数 - 我特别指的是一个以整数为模的负整数应该产生一个正数。

编辑提供一个例子:

-5 modulo 3应返回1

8 个答案:

答案 0 :(得分:26)

尝试(a % b) * Math.Sign(a)

试试这个;它工作正常。

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

好的定义(如果我没有记错的话)是这样的

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

它可能非常慢,并且要注意整数除法,就像内置模数一样:)

其他选项是根据操作数的符号修改内置模数的结果。像这样:

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

答案 3 :(得分:2)

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

这只需要一个%的操作(and one ternary op)而不需要乘法

答案 4 :(得分:1)

如果您正在使用这些算法中的任何一种,并且您也需要进行除法,请不要忘记确保在适当的时候减去1。

即,

如果-5 % 2 = -1-5 / 2 = -2,如果您关心-5 / 2 * 2 + -5 % 2 = -5,那么当您计算-5 % 2 = 1时,您还要计算-5 / 2 = -3

答案 5 :(得分:0)

修复:

(ans = a%b)&lt; 0? (a&lt; 0&amp; b&lt; 0?(ans-b)%( - b):( ans + b)%b):ans

答案 6 :(得分:0)

我知道问题没有要求它,但我只是编写并测试了一个返回商的方法。我找的时候没有发现这个,所以我想我会把它放在那里。

/// <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;
}

答案 7 :(得分:-2)