【发布时间】:2010-04-22 13:10:49
【问题描述】:
c# 中是否有一个库函数用于数字的数学模数 - 我特别指的是负整数模正整数应该产生正结果。
编辑以提供示例:
-5 模 3 应该返回 1
【问题讨论】:
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 int.MaxValue 的任何情况下),您可能会溢出。
那么定义(如果我没记错的话)是这样的
a mod b = a - b * floor(a/b)
它可能很慢并且要小心整数除法,就像内置的模数一样:)
其他选项是根据操作数的符号修改内置模数的结果。像这样的:
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。
【讨论】:
修复:
(ans=a%b)
【讨论】:
我知道问题不是问的,但我只是编写并测试了一个返回商的方法。我找的时候没找到,所以我想把它放在那里。
/// <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;
}
【讨论】:
【讨论】:
-5 % 2 成为 +1,而不是 -1。