模算術和負索引
負整數的標準模運算 (%) 在用於陣列索引時可能會產生意外結果。 餘數可能為負數,導致索引值無效。 為了確保正確的正數組索引,我們需要修改模函數。
常見的解決方案是使用以下公式:
<code>GetArrayIndex(i, arrayLength) = (i % arrayLength + arrayLength) % arrayLength</code>
這保證了 [0, arrayLength - 1] 範圍內的正索引,無論輸入 i
的符號如何。
自訂模函數
為了讓程式碼更簡潔,自訂 mod
函數會很有幫助:
<code class="language-java">public static int mod(int x, int m) { return (x % m + m) % m; }</code>
此函數透過加上 m
來處理負餘數,以確保得到正結果。
最佳化模函數
為了提高效率(更少的模運算),請考慮以下替代方案:
<code class="language-java">public static int mod(int x, int m) { int r = x % m; return r < 0 ? r + m : r; }</code>
此版本直接檢查餘數r
是否為負數,僅在必要時加上m
。
範例
使用自訂 mod
函數,我們可以得到預期的陣列索引行為:
GetArrayIndex(4, 3) == 1
GetArrayIndex(3, 3) == 0
GetArrayIndex(2, 3) == 2
GetArrayIndex(1, 3) == 1
GetArrayIndex(0, 3) == 0
GetArrayIndex(-1, 3) == 2
GetArrayIndex(-2, 3) == 1
GetArrayIndex(-3, 3) == 0
GetArrayIndex(-4, 3) == 2
以上是如何處理模運算中的負數以實現正確的數組索引?的詳細內容。更多資訊請關注PHP中文網其他相關文章!