【问题标题】:Having trouble with the mod operator; I'm not getting the result I'm expecting使用 mod 操作符有问题;我没有得到我期望的结果
【发布时间】:2016-01-29 04:19:24
【问题描述】:

codingbat.com上有一个谜题,看起来很琐碎,但是当我解决并提交时,传入参数4515时标记为错误到方法。我对以下问题的逻辑在这里做错了什么?

如果给定的非负数是 3 或 5 的倍数,则返回 true, 但不是两者兼而有之。使用 % "mod" 运算符 -- 请参阅 Mod 简介

我的解决方案:

public Boolean old35(int n) {
  if( n % 3 == 0 || n % 5 == 0 && !(n % 3 == 0 && n % 5 == 0) ){
    return true;
  }

  return false;
}

Codingbat 的解决方案对我来说毫无意义:

public Boolean old35(int n) {
    return n % 3 == 0 ^ n % 5 == 0;
}

【问题讨论】:

  • ^ 是“排他性的或”——它的意思是“这些条件之一,但不是两个”。
  • 您没有检查“NOT BOTH”的情况。

标签: java


【解决方案1】:

&& 运算符优先于 ||,因此它发生在 !(n % 3 == 0 && n % 5 == 0) 之后但在 or || 之前。对于45,它确实是35 的倍数,所以! 返回false。它是5 的倍数,所以true & false 产生false。是3的倍数,所以truefalse得到true,根据要求是不正确的。

您可以通过在第一个 && 之前插入括号来强制 || 来纠正您的解决方案:

//  v                          v
if( ( n % 3 == 0 || n % 5 == 0 ) && !(n % 3 == 0 && n % 5 == 0) ){

Codingbat 的解决方案使用 XOR 运算符 ^。该运算符表示其中一个或另一个为真,但不是两者都为真,这完全符合要求。另外,if 没有任何理由;可以直接返回布尔表达式。

【讨论】:

    【解决方案2】:

    您的解决方案几乎是正确的。你只需要括号:

    if((n % 3 == 0 || n % 5 == 0) && !(n % 3 == 0 && n % 5 == 0) )
    

    没有括号,它被视为

    if( n % 3 == 0 || (n % 5 == 0 && !(n % 3 == 0 && n % 5 == 0)) )
    

    ^ 是异或。 x ^ y 表示 xy 为真,但不能同时为真。

    【讨论】:

      【解决方案3】:

      返回 (n%3 == 0 || n%5 == 0) && !(n%3 == 0 && n%5 == 0);

      您可以检查这两个条件,然后通过与门 (&&) 传递这些条件的结果。

      【讨论】:

        猜你喜欢
        • 2020-02-05
        • 1970-01-01
        • 1970-01-01
        • 2018-04-25
        • 1970-01-01
        • 2022-09-29
        • 1970-01-01
        • 2015-11-23
        • 2018-01-02
        相关资源
        最近更新 更多