Java 与mod操作员有问题;I';我没有得到我想要的结果;我期待着
codingbat.com上有一个看似微不足道的谜题,但当我解决它并提交时,当参数45或15传递给该方法时,它被标记为错误。在我对以下问题的逻辑中,我做错了什么 如果给定的非负数是3或5的倍数,则返回true, 但不是两者都有。使用%“mod”运算符--请参见mod简介 我的解决方案: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
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门(&&&)传递这些条件的结果。^
是“异或”-它表示“这些条件之一,但不是两者都有”。您没有检查“不是两者”的情况。