Java 与mod操作员有问题;I';我没有得到我想要的结果;我期待着

Java 与mod操作员有问题;I';我没有得到我想要的结果;我期待着,java,Java,codingbat.com上有一个看似微不足道的谜题,但当我解决它并提交时,当参数45或15传递给该方法时,它被标记为错误。在我对以下问题的逻辑中,我做错了什么 如果给定的非负数是3或5的倍数,则返回true, 但不是两者都有。使用%“mod”运算符--请参见mod简介 我的解决方案: public Boolean old35(int n) { if( n % 3 == 0 || n % 5 == 0 && !(n % 3 == 0 && n % 5 == 0

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;
}

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

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
表示
x
y
为真,但不是两者都为真。

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

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

//  v                          v
if( ( n % 3 == 0 || n % 5 == 0 ) && !(n % 3 == 0 && n % 5 == 0) ){
Codingbat的解决方案使用XOR运算符,
^
。此运算符表示其中一个为真,但不是两个都为真,这完全符合要求。此外,如果
,则没有理由使用
;您可以直接返回布尔表达式。

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

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

^
是“异或”-它表示“这些条件之一,但不是两者都有”。您没有检查“不是两者”的情况。