模算术和负索引
负整数的标准模运算 (%) 在用于数组索引时可能会产生意外结果。 余数可能为负数,导致索引值无效。 为了确保正确的正数组索引,我们需要修改模函数。
常见的解决方案是使用以下公式:
<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中文网其他相关文章!