1. ホーム
  2. c#

[解決済み] C#の整数演算では、a/b/cは常にa/(b*c)になるのでしょうか?

2023-06-22 05:53:03

質問

a, b, cを大きくない正の整数とする。C#の整数演算でa/b/cは常にa/(b * c)になるのでしょうか? 私の場合、C#では、次のようになります。

int a = 5126, b = 76, c = 14;
int x1 = a / b / c;
int x2 = a / (b * c);

そこで質問なのですが x1 == x2 はすべてのa,b,cに対応するのでしょうか?

どのように解決するのですか?

次のようにします。 \ は整数の除算を表します(C#の / 演算子で2つの int の間にある) とし / は通常の数学の除算を表す。すると、もし x,y,z 正の整数 であり、私たちは オーバーフローを無視する ,

(x \ y) \ z
    = floor(floor(x / y) / z)      [1]
    = floor((x / y) / z)           [2]
    = floor(x / (y * z))
    = x \ (y * z)

ここで

a \ b = floor(a / b)

行目からのジャンプ [1] から行 [2] を説明すると、次のようになります。仮に二つの整数 ab と、分数である f の範囲で [0, 1) . というのは簡単です。

floor(a / b) = floor((a + f) / b)  [3]

もし、行内で [1] を指定すると a = floor(x / y) , f = (x / y) - floor(x / y) そして b = z であれば [3] はそれを意味する [1] となり [2] は等しい。

この証明を負の整数に一般化することができる(それでも オーバーフローを無視する を無視する)ことができますが、ポイントをシンプルにするため、読者に任せます。


の問題については オーバーフロー - については、Eric Lippert の回答が良い説明になっています! 彼はまた、より厳密なアプローチで 彼のブログ記事 でもっと厳密なアプローチをとっています。私があまりに手探りだと感じたら、ぜひ調べてみてください。