#java #if #math
Как математически грамотно (желательно на Java) одним условием проверить, принадлежит ли натуральное число b отрезку [a, c], где a и c так же натуральные числа? Условие должно выполниться, например, при таких значениях a, b, и c соответственно: (1, 2, 3), (5, 7, 10), (17, 25, 25), но не должно выполниться, например, при таких значениях a, b, и c соответственно: (2, 1, 3), (17, 25, 24). Условие должно быть одно, использовать логические операторы (такие как &&, ||, и т.п.) нельзя.
Ответы
Ответ 1
Если точка лежит внутри отрезка, то сумма расстояний от этой точки до крайних точек отрезка всегда равна расстоянию между крайними точками. Если точка лежит вне отрезка, тогда сумма расстояний всегда будет больше. Иллюстрация: Как известно, расстояние между двумя точками на отрезке – это модуль разности координат этих точек. Отсюда получаем условие: Math.abs(b - a) + Math.abs(b - c) == c - a // с учётом, что всегда c >= a, иначе Math.abs(c - a)Ответ 2
Я придумал такой вариант Перемножить две разности: (b - a) * (c - b) Проверить результат: если меньше нуля, то одна из разностей отрицательна, это значит что число b не входит в интервал [a, c] если равно нулю, то число b равно одному из чисел a, c, т.е. входит в интервал [a, c] если больше нуля, то число b принадлежит интервалу (a, c), что является даже более сильным условием, чем принадлежность к [a, c] Применительно к данной задаче, финальное условие будет выглядеть так: boolean membership = ((b - a) * (c - b) >= 0); Полный код программы, с которым можно поиграться: public class Solution { public static void main(String[] args) { int[][] tests = { { 1, 2, 3 }, { 5, 7, 10 }, { 4, 4, 11 }, { 17, 25, 25 }, { 2, 1, 3 }, { 17, 25, 24 } }; for (int[] v : tests) { int a = v[0], b = v[1], c = v[2]; boolean membership = ((b - a) * (c - b) >= 0); System.out.format("(%d, %d, %d) => %b\n", a, b, c, membership); } } } Минус данного решения в том, что при больших числах возможно переполнение на умножении. Впрочем, если входные данные имеют тип int, то от переполнения можно будет избавиться, используя в вычислениях тип longОтвет 3
А что, если реализовать класс Отрезок с булевым методом точка входит? Решение получается довольно читабельным и понятным, на мой взгляд. Если такой обход "двойного условия" не допустим условиями задачи, то решение не подходит. public static void main(String[] args) { int a=1,b=2,c=3; if(new Segment(a,c).isEnter(b)){ System.out.println("Входит"); }else{ System.out.println("Не входит"); } } static class Segment{ int a,c; public Segment(int a, int c) { this.a = a; this.c = c; } public boolean isEnter(int b) { return a<=b&&c>=b; } }
Комментариев нет:
Отправить комментарий