Frage Mathematischer Modul in c #


Gibt es in c # eine Bibliotheksfunktion für den mathematischen Betrag einer Zahl - damit meine ich ausdrücklich, dass eine negative ganze Zahl modulo eine positive Ganzzahl sein sollte, die ein positives Ergebnis liefert.

bearbeitet, um ein Beispiel zu geben:

-5 modulo 3 sollte 1 zurückgeben


25
2018-04-22 13:10


Ursprung


Antworten:


Versuchen (a % b) * Math.Sign(a)

Versuche dies; es funktioniert richtig.

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

24
2018-04-22 13:12



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

5
2018-04-22 13:26



Nun, die Definition (wenn ich mich nicht irre) ist so etwas

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

Es ist wahrscheinlich ziemlich langsam und hüte dich vor Integer Division genau wie in Modulo gebaut :)

Eine andere Option besteht darin, das Ergebnis des eingebauten Moduls gemäß den Vorzeichen der Operanden zu modifizieren. Etwas wie das:

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

4
2018-04-22 13:26



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

Das erfordert nur eine% Operation (and one ternary op) und keine Multiplikation


2
2017-11-29 12:01



Wenn Sie einen dieser Algorithmen verwenden und auch Division durchführen müssen, vergessen Sie nicht, dass Sie 1 gegebenenfalls subtrahieren.

I.e.

ob -5 % 2 = -1 und -5 / 2 = -2und wenn dir das wichtig ist -5 / 2 * 2 + -5 % 2 = -5, dann, wenn Sie rechnen -5 % 2 = 1, die Sie auch berechnen -5 / 2 = -3.


1
2018-04-23 01:25



Du könntest dein eigenes Like schreiben Math.Abs(x % y);


0
2018-04-22 13:13



Fix:

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


0
2018-04-22 16:44



Ich weiß, dass die Frage nicht danach gefragt hat, aber ich habe gerade eine Methode geschrieben und getestet, die den Quotienten ebenfalls zurückgibt. Ich habe das nicht gefunden, als ich danach suchte, also dachte ich, ich würde es da draußen veröffentlichen.

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

0
2017-08-22 16:06



Könnte der Operator% sein?

http://msdn.microsoft.com/en-us/library/0w4e0fzs.aspx


-2
2018-04-22 13:12