使用mod运算符时遇到问题;我没有得到我期待的结果

时间:2015-10-26 21:07:00

标签: 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) ){
    return true;
  }

  return false;
}

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

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

3 个答案:

答案 0 :(得分:6)

&&运算符优先于||,因此它在!(n % 3 == 0 && n % 5 == 0)之后但在||之前发生。对于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;你可以直接返回布尔表达式。

答案 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表示xy为真,但不是两者。

答案 2 :(得分:1)

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

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