• ,

Не знаю как сделать, чтобы вычислял максимум из отрицательных чисел.

public class Solution
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int maximum = 0;
        int a = Integer.parseInt(reader.readLine());
        for (int i = 0; i < a; i++)
        {
            int N = Integer.parseInt(reader.readLine());
            if (maximum < N)
            {
              maximum=N;

            }
        }
        System.out.println(maximum);
    }
}

29 комментариев

aurora
Если вводить отрицательные числа, у вас никогда не выполнится условие, заданное в цикле. 0 всегда больше отрицательного числа. Меняйте условие.
EvIv
При поиске максимума всегда инициализируйся минимальным значением. Для отрицательных чисел 0 — не минимально возможное значение. В классе Integer есть константа: Integer.MIN_VALUE — минимальное значение из доступного диапазона Integer.
Аналогично для поиска минимума: инициализируем максимальным значением: Integer.MAX_VALUE.
Ну либо можно инициализироваться первым значением из тех, среди которых ищем максимум/минимум (если массив: то элемент [0], если вводимые пользователем, то первое чтение сделать вне цикла и т.п.), но такое решение мне кажется менее красивым и элегантным, чем первое. Оно более цельное и без лишнего дублирования кода.
EvIv
  • EvIv
  • +2
  • Комментарий отредактирован 2016-05-18 17:31:07 пользователем EvIv
И вообще, такие ошибки легко ловятся при дебаге с пошаговым выполнением кода и просмотром значений переменных после каждого шага.
Например, на строке с условием if (maximum < N) смотришь, чему равен maximum и чему равен N
на первой итерации maximum = 0, N = -5 (например). Условие не выполняется и maximum остается равным 0
На следующем шаге то же самое. И на следующем. И дальше — ни одно отрицательное число не больше 0. maximum всегда останется 0.
При пошаговом выполнении программы это сразу становится заметно. Ставишь точку останова на интересующей строке программы (щелчок ЛКМ на левое поле напротив строки — появится жирная красная точка), запускаешь программу не треугольной стрелкой, а зелёным клопом — программа дойдет до точки останова и встанет на паузу, а внизу покажет все переменные и чему они сейчас равны. F8 — сделать один шаг в программе, F7 — зайти внутрь метода, F9 — запустить программу дальше на быстрое выполнение.
PS: OFFTOP: переменные и методы в Джаве принято называть с маленькой буквы. С большой буквы начинаются имена классов, интерфейсов и енумов, а большими буквами называют константы. Для лучшей читаемости кода лучше переименовать N в n.
Raven
Нашел на просторах интернета код, подогнал под программу, но не понимаю, то что выделил «жирным» шрифтом :(


public class Solution
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int maximum = 0;
        int n = Integer.parseInt(reader.readLine());
        for (int i = 0; i < n; i++)
        {
            int a = Integer.parseInt(reader.readLine());
            <strong>if (maximum == N)maximum=a;
            maximum=max(a, maximum);</strong>
        }
            System.out.println(maximum);
    }
   <strong> public static int max(int a, int b)
    {
    return a>b ? a:b;
    }</strong>
}

HansNoodles
  • HansNoodles
  • +1
  • Комментарий отредактирован 2016-05-23 15:47:25 пользователем HansNoodles
Читаем раздел «Тернарный оператор»:
developer.alexanderklimov.ru/android/java/logic_operators.php
EvIv
public static int max(int a, int b)
    {
    return a>b ? a:b;
    }

это понятно — из двух чисел возвращает бОльшее.
просто это так называемый тернарный оператор: {условие}? {выполнить если true}: {выполнить если false}
а вот это:
if (maximum == N)maximum=a;
            maximum=max(a, maximum);

не понимаю для чего и зачем. Что такое N?
строка maximum = max(a, maximum) понятна. Она поместит в maximum максимальное из его аргументов. Этой строки будет достаточно без строчки выще.
НО! Опять инициализируете нулём: int maximum = 0; — перед циклом. Это неправильно!!!
Как работает поиск максимума?
Идёте на рыбалку с ведром, удочкой и целью: принести домой самую большую рыбину.
Ваш алгоритм: ловите рыбу. первую пойманную кидаете в ведро. Вторую сравниваете с той что в ведре и если больше, из ведра рыбу отпускаете и кидаете в ведро новую. Если новая меньше, отпускаете её.
Рыба — это число, введенное пользователем. Ведро — переменная максимум.
Первую рыбу вы кидаете в ведро без проверок. Остальные проверяете — сравниваете с содержимым ведра.
ЛИБО! проверяете каждый раз (чтобы не было особого случая для первого раза), но перед этим кладете в ведро САМУЮ МАЛЕНЬКУЮ ВОЗМОЖНУЮ рыбу, чтобы любая пойманная оказалась сразу в ведре.
Так вот, 0 — это НЕ САМАЯ МАЛЕНЬКАЯ РЫБА
Среди отрицательных она наоборот самая большая! Она всегда будет оставаться в ведре. -1000 > 0, -1 > 0, -50000000 > 0
Самое мальенькое возможное число среди int равно Integer.MIN_VALUE. Пользуйся им.
HansNoodles
Основная ошибка, как уже сказали выше, в неправильном начальном значении переменной maximum. Чтобы программа работала корректно, необходимо инициализировать его либо первым анализируемым элементом массива или минимальным значением допустимым для текущего типа(в данном случае Integer.MIN_VALUE).
zub777
package com.javarush.test.level05.lesson12.bonus03;

import java.io.*;

/* Задача по алгоритмам
Написать программу, которая:
1. вводит с консоли число N > 0
2. потом вводит N чисел с консоли
3. выводит на экран максимальное из введенных N чисел.
*/

public class Solution
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String nn=reader.readLine();
        int n=Integer.parseInt(nn);
        int[] myArray=new int[n];


        for(int i = 0; i < n;i++){
            String nnm=reader.readLine();
            int nm=Integer.parseInt(nnm);
            //int nm=n;
            myArray[i] = nm;
        }

        int maximum = myArray[0];
        for(int i = 0; i < myArray.length; i++){
            if(maximum < myArray[i])
                maximum = myArray[i];
        }



        System.out.println(maximum);
        
    }
}

так работает и проходит проверку
abramovskikh
Ребята! Мы изучаем JAVA по простой причине! Чтобы меньше писать кода! Все уже написанно! Учим по мере прохождения курса и библиотеки JAVA API.
Там в каталоге java.util.Arrays есть отличный метод sort()! Я решил это упражнение дописав всего шесть строчек кода! Я дал подсказку, дальше сами!
abramovskikh
Ребята! Мы изучаем JAVA по простой причине! Чтобы меньше писать кода! Все уже написанно! Учим по мере прохождения курса и библиотеки JAVA API.
Там в каталоге java.util.Arrays есть отличный метод sort()! Я решил это упражнение дописав всего шесть строчек кода! Я дал подсказку, дальше сами!
Smetchik
Да метод полезны однако если вам нужно будет отсортировать все в обратную сторону, что будете делать?

P.S. Изучение и понимание алгоритмов, это основа программирования на любом языке. тАк как алгоритмы скрытые в стандартной библиотеке не панацея.
ArtemShch
  • ArtemShch
  • 0
  • Комментарий отредактирован 2016-06-23 15:13:16 пользователем ArtemShch
В обратную сторону тоже можно отсортировать
<code>
Collections.sort(list); //сортировка по-возрастанию
Collections.sort(list, Collections.reverseOrder()); //сортировка по-убыванию
</code>
Smetchik
Ок, отсортируйте своим методом заполненный массив int[] i = new int[100] по убыванию.
ArtemShch
Не увидел, что о массивах идет речь, с примитивными типами такой фокус не прокатит (со стандартной библиотекой).

Можно извратиться, скопировать массив в лист, его отсортировать как надо, а потом обратно)
Smetchik
Ок. Усложним задачу. double i = new double[2147483647]. Как будете через List делать? Да главное как быстро это будет работать посравнения с алгоритмом реализованным руками?
ArtemShch
Если усложнить, то и задача будет другая и решение соответственно.
Joysi
  • Joysi
  • 0
  • Комментарий отредактирован 2016-06-24 14:10:23 пользователем Joysi
Можно и через формулы считать минимум или максимум. Из школьной программы:
Максимум 2х чисел
max(a,b)=(a+b+Math.abs(a-b))/2

Минимум 2х чисел
min(a,b)=(a+b-Math.abs(a-b))/2

Где Math.abs() — модуль числа (функция пакета Math в Java).
Работает как для отрицательных, так и для положительных чисел.
Smetchik
a=-2 b=4 max(-2+4+abs(-2+4))/2 = (2 + 2)/2 =2 min(2 — 2)/2 =0
Как бы не работает.
Joysi
a=-2 b=4 max(-2+4+abs(-2-4))/2 = (2 + 6)/2 =4 min(2 — 6)/2 =-2
Smetchik
Угу ступил :)
Joysi
Работает как часы :)
summerokk
а почему нельзя изначально задать maximum значением?
int maximum = Integer.parseInt(reader.readLine());

а цикл сделать не N, а N-1
summerokk
у меня такое решение приняло если то
LordDeadHead

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int maximum = -2147483648;
        int N = Integer.parseInt(reader.readLine());
        if (N>0)
        {
            for (int i = 0; i < N; i++)
            {
                int number = Integer.parseInt(reader.readLine());
                if (number > maximum)
                    maximum = number;
            }
        }

        System.out.println(maximum);

Насколько такое решение будет плохим и почему? Если изначально задать значению maximum = -2147483648?
Joysi
Нормально. Один момент, избегайте в коде явных констант (текстовых, строковых и т.п.), так как часто в их написании можно ошибиться + если необходимо править значение во многих местах, то придется вносить много правок. Вместо
int maximum = -2147483648;
лучше используйте
int maximum = Integer.MIN_VALUE;
LordDeadHead
Понял, спасибо!
marchelloua
Мой вариант принят:


package com.javarush.test.level05.lesson12.bonus03;

import java.io.*;

/* Задача по алгоритмам
Написать программу, которая:
1. вводит с консоли число N > 0
2. потом вводит N чисел с консоли
3. выводит на экран максимальное из введенных N чисел.
*/

public class Solution
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int maximum = 0;
        int i = 1;
        int N = Integer.parseInt(reader.readLine());//напишите тут ваш код
        if (N > 0)
        {
            while (i <= N)
            {
                int b = Integer.parseInt(reader.readLine());
                if (i == 1)
                    maximum = b;
                if (b > maximum)
                    maximum = b;
                if (i == N)
                    System.out.println(maximum);
                i = i + 1;
            }
        }
    }
}
EvIv
И зачем это здесь? Чтобы остальные не думая могли сдать задачу?
info.javarush.ru/page/FAQ/ первый вопрос
marchelloua
Попрошу администрацию удалить…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.