Сравнение целочисленных переменных для наибольшего в пределах диапазона

Мне трудно понять, почему мой код не работает для этой проблемы, которую я пытаюсь решить.

Вопрос: Учитывая 2 положительных значения int, верните большее значение, которое находится в диапазоне от 10 до 20 включительно, или 0, если ни одно из них не находится в этом диапазоне.

Мой код:

public int max1020(int a, int b) {
  int max;

  if((a<10 || a>20) && (b<10 || b>20)) {
  max = 0;
  }

  if(Math.max(a,b) >= 10 && Math.max(a,b) <= 20) {
  max = Math.max(a,b);
  } else {
  max = Math.min(a,b);
  }

  return max;
}

Все числа работают, кроме случаев, когда a = 9 и b = 21, чего я просто не понимаю. Где я ошибся?


person P_Locked    schedule 24.12.2015    source источник
comment
Пройдитесь по коду с помощью отладчика.   -  person Oliver Charlesworth    schedule 24.12.2015
comment
вернуть 0 вместо установки max на 0   -  person Taelsin    schedule 24.12.2015
comment
Всем большое спасибо за помощь. Теперь я вижу, где я ошибся.   -  person P_Locked    schedule 25.12.2015


Ответы (4)


вы не возвращаете 0 .. никогда .. так что 9 меньше 10 .. а b больше 20, поэтому верните 0. Я думаю, вы получаете 9, потому что вы все еще выполняете раздел, когда оба числа попадают в пределы.

публичный интервал max1020 (int a, int b) { int max;

      if((a<10 || a>20) && (b<10 || b>20)) {
      **>> return 0;**
      }

      if(Math.max(a,b) >= 10 && Math.max(a,b) <= 20) {
      max = Math.max(a,b);
      } else {
      max = Math.min(a,b);
      }

      return max;
    }
person DaveTheRave    schedule 24.12.2015

Ваш код говорит, что если a && b не находится между 10 или 20 max = 0.

Затем он переходит к вычислению того, что является максимальным, а какое минимальным, независимо от того, какие числа.

Вы должны немедленно вернуть 0, если a&&b не находится между 10 и 20.

eg.

public int max1020(int a, int b) {
  int max;

if((a<10 || a>20) && (b<10 || b>20)) {
    return 0;
}

if(Math.max(a,b) >= 10 && Math.max(a,b) <= 20) {
    max = Math.max(a,b);
} else {
 max = Math.min(a,b);
}

return max;
}
person jtum25    schedule 24.12.2015
comment
Ваш оператор else никогда не будет достигнут. - person Ceelos; 24.12.2015

Отредактирован исходный ответ, потому что я наблюдал за некоторыми случаями.
Следующее должно работать на то, что вам нравится

static int max1020(int a, int b) {
    int max = 0;
    if ((a < 10 || a > 20) && (b < 10 || b > 20)) {
        //If neither fall between 10 and 20, return immediately.
        return max;
    }
    if (Math.max(a, b) >= 10 && Math.max(a, b) <= 20) {
        //If both fall between 10 and 20, return the larger value.
        max = Math.max(a, b);
    } else if ((a >= 10) && (a <= 20)) {
        //If both didn't fall between 10 and 20, check if it was a.
        max = a;
    } else {
        //If a didn't fall between 10 and 20, then it must be b.
        max = b;
    }
    return max;
}
person Ceelos    schedule 24.12.2015

Как насчет этого?

public int max1020(int a, int b) {
  int max = 0;
  if (10 <= a && a <= 20)
    max = a;
  if (10 <= b && b <= 20)
    max = Math.max(max, b);
  return max;
}
person Roland Illig    schedule 24.12.2015