C#中有没有一个库函数可以用于计算数字的模数 - 具体而言,当负整数模正整数时,应产生一个正结果。
编辑后提供一个示例:
-5模3应返回1
试试这个方法,它能够正确地工作:
(a % b) * Math.Sign(a)
static int MathMod(int a, int b) {
return (Math.Abs(a * b) + a) % b;
}
x < 0 ? ((x % m) + m) % m : x % m;
x = 1
和m = int.MaxValue
(或在任何0 < x < m且x + m > int.MaxValue的情况下)时,你可能会溢出。 - Michael Petito如果我没记错,mod的定义应该是这样的:
a mod b = a - b * floor(a/b)
这个方法可能比较慢,而且要注意整数除法,就像内置的modulus一样。
另一个选项是根据操作数的符号修改内置模数的结果。可以尝试以下代码:
if(a < 0 && b > 0)
{
return (a % b + b) % b;
}
else if ....
a < 0 ? ((a+1)%b + b-1) : (a%b);
如果您正在使用这些算法并且需要进行除法运算,请不要忘记在适当时候减去1。
I.e.,
如果-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;
}
(ans=a%b)<0 ? (a<0 && b<0 ? (ans-b)%(-b) : (ans+b)%b) : ans
-5%2
的结果是**+1**,而不是-1。 - SLaks