C/C のモジュロ計算での負の数の処理 /Obj-C
C ベースの言語では、「%」を使用したモジュロ演算" 演算子は、負の数を扱うときに予期しない動作を示す可能性があります。具体的には、結果は数学的なモジュロ演算の結果とは異なる場合があります。
問題の説明
数学的概念として、モジュロ除算は 1 つの数値を次の値で割ったときの余りを返します。別の。ただし、C/C /Obj-C では、モジュロ演算子は、正の剰余を確保することよりも、被除数 (最初のオペランド) の符号を保持することを優先します。これにより、数学的な除算の結果が正の剰余になる場合でも、負の結果が生じる可能性があります。
たとえば、「(-1) % 8」という式を考えてみましょう。数学的には、8 は 1 回 -1 になり、余りが 7 になるため、これは 7 を返すはずです。ただし、 C/C では、被除数の符号が維持されるため、結果は -1 になります。
実装に関する考慮事項を含む解決策
この状況を修正するには、負の数を考慮してモジュロ演算子の改訂版を実装できます。
<code class="c++">int customMod(int a, int b) { if (b < 0) { return -customMod(-a, -b); } int ret = a % b; if (ret < 0) { ret += b; } return ret; }</code>
この最適化されたバージョンでは、オペランドの が負の場合、両方の符号を反転し、カスタム モジュロ演算子を再帰的に呼び出します。剰余を計算した後、それが負であるかどうかを確認し、除数を加算して正にします。これにより、最終結果が正しい数学的剰余を維持することが保証されます。たとえば、customMod(-1, 8) は 7 を返しますが、customMod(13, -8) は -3 を返します。
全体的に、この改訂されたモジュロ演算子は負の数値を効果的に処理し、数学的結果と一致する結果を生成します。モジュロ期待値。
以上がC/C /Obj-C のモジュロ演算で負の数を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。