【问题标题】:java modular division sanity checkjava模块化划分健全性检查
【发布时间】:2011-10-11 08:46:57
【问题描述】:

如果我的模块化划分是正确的; 1 / 5 mod 11 = 9。有人可以确认吗?

但是,在 Java 中; 1 / 5 % 11 = 0;

我不确定这里发生了什么,这是我的语法,我需要以某种方式将它括起来吗?

我现在很困惑:)

有人可以建议吗?

谢谢

【问题讨论】:

    标签: java division modular


    【解决方案1】:

    这与 (1/5) mod 11 相同。

    (或者与 1 / (5 mod 11) 相同,仍然是 1/5 == 0 [从左到右实际上是 (1/5) mod 11])

    1 / 5 = 0(整数)

    0 模 11 = 0

    【讨论】:

    • 谢谢,我明白为什么会这样了。我将不得不做更多的研究。谢谢
    【解决方案2】:

    1 / 5 mod 11 = 9。有人可以确认吗?

    (9 * 5) % 11 = 45 % 11 = 1。所以,是的,9 是“mod 11”中 5 的模乘逆。

    问题是:Java 只有整数,没有模运算。在 Java 中,% 只是一个类似于* 的运算符。

    来自http://en.wikipedia.org/wiki/Modular_arithmetic

    模运算的概念与除法中的余数的概念相关

    所以,mod 11% 11 是相关的,但不是一回事!

    【讨论】:

    • 你是对的。我以错误的方式接近它。为了得到我的答案,我刚刚实现并测试了这个: for (int i = 0; i
    【解决方案3】:

    http://www.difranco.net/cop2551/java_op-prec.htm 表示 *、/ 和 % 具有相同的优先顺序,但在表达式中 / 将优先于 %。所以你上面的 Java 结果是正确的 w.r.t JLS。

    【讨论】:

    • 您引用的链接丝毫不支持您的答案,并且您的答案体现了术语上的矛盾。它们要么具有相同的优先级,要么一个优先于另一个。事实上,同等优先级的运算符是从左到右计算的。这些都不足以解释 OP 的问题。
    【解决方案4】:

    这是因为运算符优先级。

    Java 确实通过了它简化表达的地方。它执行一些操作,然后在下一次通过它执行一些其他操作。 “最高”运算符首先完成。例如乘法在加法之前。运算符( ) 在第一遍中,让您覆盖正常的事情完成顺序。

    查看此图表:enter link description here

    %*/ 在同一组中。它们是从左到右完成的。

    所以你想要(1/5) % 11

    但是您还有另一个问题,因为这将在浮点数学中完成,因此您将得到一个近似值而不是确切的正确答案。

    您需要使用BigInteger 类而不是内置原语。

    【讨论】:

    • “Java 确实通过了它简化表达的地方。它做了一些操作,然后在下一次它做一些其他操作。”。这根本不是那么回事。 Java 与任何其他编程语言一样,使用 RPN 和堆栈来评估表达式。没有多个“通过”。只是操作符在 RPN 中出现的顺序。
    • 我在这个和你是对的。但是,我正在为初学者简化答案。
    • 通过使答案变得比实际更复杂来简化答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2015-04-10
    相关资源
    最近更新 更多