【问题标题】:Java modular divisionJava模块化划分
【发布时间】:2011-10-22 16:11:02
【问题描述】:

我正在做一些错误纠正,我需要在 Java 中的 mod 11 下除两位数。

现在我知道了,通过使用模块化计算器:

9/1 mod 11 = 9
2/10 mod 11 = 9

问题在于让 Java 计算它。在 Java 中:

(9 / 1) % 11 = 9 - This is fine
(2 / 10) % 11 = 0 - This is not correct.

我知道 Java 在技术上无法执行模块化操作,我的一部分人认为我要么需要以某种方式计算逆,要么使用数组来存储可能的输出值。

【问题讨论】:

  • Err,2 / 10 是 0。而 0 % 11 是 0。为什么会是 9?
  • 因为我是在mod 11下做的。不是正常除法。
  • 我刚刚做的是:(2 * 10) % 11 = 9。这似乎给了我正确的答案。
  • 啊,当然。但是乘法和除法并不完全相同。您找到了适合您解决方案的正确问题。
  • @stivlo:问题是关于在modular arithmetic 中反转乘法。因为 10 是它自己的反模 11,所以乘以 10 除以 10 在模 11 算术中具有相同的效果。这就是为什么托尼碰巧在上面几厘米的地方得到了正确的答案。

标签: java division modular-arithmetic


【解决方案1】:

我认为您正在寻找的是如何找到一个数字模 11 的乘法逆元。

10 是它自己的反模 11,所以它不是一个特别有用的例子。相反,让我们求 7 模 11 的乘法逆元。

为此,我们对整数 a 和 b 求解方程 7a + 11b = 1。我们使用Euclidean algorithm 为a 和b 找到合适的值。在这种情况下,我们可以取 a = -3 和 b = 2。我们忽略 b 的值,取 a ( = -3) 为 7 模 11 的倒数。在模 11 算术中,7 乘以 -3是 1。

如果我们不喜欢负数,我们可以取 7 模 11 的倒数为 8 (= -3 + 11)。

因此,我们不是除以 7 模 11,而是乘以 -3 或 8。例如,在模 11 算术中,9 / 7 = 9 * 8 = 72 = 6。

如果您只能使用一个模数(例如,您只能使用模 11),那么最好事先计算一个模 11 的乘法逆数表并在您的计算中使用它。

【讨论】:

  • 感谢卢克,我怀疑这就是我必须要做的。您对生成这样的表格有什么建议吗?我猜我需要一个多维数组?
  • 我不明白你为什么需要一个多维数组。如果您只使用模 11,请计算模 11 的 1 到 10 的倒数并将它们放入一维数组中。如果您要处理大量模数或任何大模数,那么表格就不是一个好主意。
  • 谢谢卢克,我对自己想做的事情有点困惑(对我来说还为时过早):)。我现在已经使用数组构建了一个逆表,现在一切都按计划进行。谢谢你的帮助!!
  • 卢克,你帮了我很大的忙,我想知道我是否可以最后一次请求你的帮助。简单地说,当我输入 y = -4 % 11 时,我需要一种在 Java 中输出 7 的方法。有什么建议吗?
  • @Tony:处理负数和正数的一种可能表达式是((y % 11) + 11) % 11
【解决方案2】:

不确定这是否是您想要的,但是...

public static int divmod(int dividend, int divisor, int mod) {
    if (dividend >= divisor)
        return (dividend / divisor) % mod;
    return mod - dividend;
}

测试它:

divmod(9, 1, 11)  // returns 9
divmod(2, 10, 11) // returns 9

【讨论】:

  • 感谢 Óscar,这适用于某些数字对,但不适用于其他数字对。
  • 给我一组测试的数字,特别是那些失败的,我会看看我能做些什么来帮助你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 2018-01-20
  • 2012-01-25
相关资源
最近更新 更多