На codingbat.com есть головоломка, которая казалась довольно тривиальной, но когда я решил ее и отправил, она была помечена неправильно, когда аргумент 45 или 15 был передан методу. . Что я делаю не так в своей логике, отвечая на следующий вопрос?

Верните true, если заданное неотрицательное число кратно 3 или 5, но не обоим сразу. Используйте оператор% "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;
}
2
Doublespeed 27 Окт 2015 в 00:07

3 ответа

Лучший ответ

Оператор && имеет приоритет перед ||, поэтому он имеет место после !(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; вы можете напрямую вернуть логическое выражение.

6
rgettman 26 Окт 2015 в 21:11

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

Вы можете проверить оба условия, а затем передать результаты этих условий через логический элемент И (&&).

1
Waz 28 Янв 2016 в 20:19

Ваше решение почти правильное. Вам просто понадобятся скобки:

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
Paul Boddington 26 Окт 2015 в 21:10