在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) ){
return true;
}
return false;
}
Codingbat的解决方案对我来说毫无意义:
public Boolean old35(int n) {
return n % 3 == 0 ^ n % 5 == 0;
}
答案 0 :(得分:6)
&&
运算符优先于||
,因此它在!(n % 3 == 0 && n % 5 == 0)
之后但在||
之前发生。对于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运算符^
。这个运算符意味着一个或另一个是真的,但不是两个,这完全符合要求。此外,没有理由if
;你可以直接返回布尔表达式。
答案 1 :(得分: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
表示x
或y
为真,但不是两者。
答案 2 :(得分:1)
return (n%3 == 0 || n%5 == 0)&& !(n%3 == 0&& n%5 == 0);
您可以检查这两个条件,然后通过AND门(&&)传递这些条件的结果。