JavaRush/Java блог/Архив info.javarush/Кухня(); Задание N47
terranum
28 уровень

Кухня(); Задание N47

Статья из группы Архив info.javarush
участников
Кухня(); Задание N47 - 1 Правила [Одномерные массивы] 47. Дано действительное число x и массив A[n]. В массиве найти два члена, среднее арифметическое которых ближе всего к x.
Комментарии (7)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Kashey
Уровень 11
13 сентября 2014, 00:30
Тут ошибки нет?
for (int i = 0; i < a.length; i++)

i должно быть равно 1?
а то получается, что при первом проходе цикла в
if (Math.abs(temp) < Math.abs(diff))

сравниваешь одинаковые значения.
shcho_isle
Уровень 11
13 сентября 2014, 13:51
Получается сравниваю, но думаю одно лишнее сравнение погоды не сделает.
А если i будет равно 1, то мы не сможем сравнить нулевой элемент со всеми остальными.
Kashey
Уровень 11
13 сентября 2014, 14:03
Да, ты прав, я не доглядел.
shcho_isle
Уровень 11
12 сентября 2014, 18:42

public static void task47 (double x, double[] a){
    if (a.length > 1) {
        double diff = (a[0] + a[1]) / 2 - x;
        double chl1 = a[0];
        double chl2 = a[1];
        double temp;
        for (int i = 0; i < a.length; i++)
            for (int j = i + 1; j < a.length; j++){
                temp = (a[i] + a[j]) / 2 - x;
                if (Math.abs(temp) < Math.abs(diff)) {
                    diff = temp;
                    chl1 = a[i];
                    chl2 = a[j];
                }
            }
        System.out.println(chl1 + " " + chl2);
    }
}
shcho_isle
Уровень 11
13 сентября 2014, 14:19
Чуть оптимизировать:


public static void task47 (double x, double[] a){
    if (a.length > 1) {
        double diff = Math.abs((a[0] + a[1]) / 2 - x);
        double chl1 = a[0];
        double chl2 = a[1];
        double temp;
        for (int i = 0; i < a.length; i++)
            for (int j = i + 1; j < a.length; j++){
                temp = Math.abs((a[i] + a[j]) / 2 - x);
                if (temp < diff) {
                    diff = temp;
                    chl1 = a[i];
                    chl2 = a[j];
                }
            }
        System.out.println(chl1 + " " + chl2);
    }
}
Docktor91
Уровень 40
13 сентября 2014, 16:21
можно еще чуть, умножить х на 2, чтобы поменьше делить))
Airon
Уровень 34
16 сентября 2014, 15:02
ну тогда и еще одну маленькую такую капельку в море:
for (int i = 0; i < a.length— 1; i++)
Да в данном задании она мало что с оптим (все во лишь две проверки).