web-dev-qa-db-ja.com

C#での数学的係数

数値の数学的モジュラスのライブラリ関数がc#にありますか?これは、正の整数を法とする負の整数が正の結果をもたらすことを具体的に意味します。

例を提供するために編集:

-5を法とする3は1を返す必要があります

27
penguat

(a % b) * Math.Sign(a)をお試しください

これを試して;正しく動作します。

static int MathMod(int a, int b) {
    return (Math.Abs(a * b) + a) % b;
}
26
SLaks
x < 0 ? ((x % m) + m) % m : x % m;
5
Michael Petito

まあ、定義は(私が間違っていなければ)このようなものです

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

おそらくかなり遅く、組み込みのモジュラスと同じように整数の除算に注意してください:)

他のオプションは、オペランドの符号に従って組み込みモジュラスの結果を変更することです。このようなもの:

if(a < 0 && b > 0)
{
    return (a % b + b) % b;
}
else if ....
4
Maciej Hehl
a < 0 ? ((a+1)%b + b-1) : (a%b);

必要な操作は1%だけです(and one ternary op)そして乗算なし

2
K_w

これらのアルゴリズムのいずれかを使用していて、除算も行う必要がある場合は、必要に応じて1を引くことを忘れないでください。

つまり、

-5 % 2 = -1-5 / 2 = -2の場合、および-5 / 2 * 2 + -5 % 2 = -5を気にする場合は、-5 % 2 = 1を計算するときに、-5 / 2 = -3も計算します。

1
clahey

修正:

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

0
Mister_Egg_Head

質問がそれを求めていなかったことは知っていますが、商を返すメソッドを作成してテストしただけです。探していたところ見つからなかったので、出してみようと思いました。

/// <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
Keith Robertson