Skip to content
mskorotkov edited this page Dec 27, 2018 · 11 revisions

Решение задач ЕГЭ по информатике на языке Java (kege4.doc)

Условие задачи взято с сайт К. Ю. Полякова

Пример задания:

Р-01. Рассматривается множество целых чисел, принадлежащих отрезку [1033; 7737], которые делятся на 5 и не делятся на 11, 17, 19 и 23. Найдите количество таких чисел и максимальное из них. В ответе запишите два числа через пробел: сначала количество, затем максимальное число.

Вариант решения №1

Шаг 1. Создадим IntStream со значениями от 1033 до 7737. Чередой операций filter() сделаем выборку чисел (учитывая все условия задачи), а вызовом операции summaryStatistics() создадим экземпляр класса IntSummaryStatistics:

IntSummaryStatistics stats = IntStream.rangeClosed(1033, 7737)
        .filter(num -> num % 5 == 0)
        .filter(num -> num % 11 != 0)
        .filter(num -> num % 17 != 0)
        .filter(num -> num % 19 != 0)
        .filter(num -> num % 23 != 0)
        .summaryStatistics();

Шаг 2. Получим и выведем ответ:

long count = stats.getCount();
long max = stats.getMax();
System.out.println(count + " " + max);
// > 1040 7730

Полный код решения доступен по ссылке.

Вариант решения №2

Шаг 1. Создадим IntStream со значениями от 1033 до 7737. Чередой операций filter() сделаем выборку чисел (учитывая все условия задачи), а вызовом операции count() найдём их количество:

long count = IntStream.rangeClosed(1033, 7737)
        .filter(num -> num % 5 == 0)
        .filter(num -> num % 11 != 0)
        .filter(num -> num % 17 != 0)
        .filter(num -> num % 19 != 0)
        .filter(num -> num % 23 != 0)
        .count();

Шаг 2. Создадим IntStream со значениями от 1033 до 7737. Чередой операций filter() сделаем выборку чисел (учитывая все условия задачи), а вызовом операции max() найдём максимальное из них:

int max = IntStream.rangeClosed(1033, 7737)
        .filter(num -> num % 5 == 0)
        .filter(num -> num % 11 != 0)
        .filter(num -> num % 17 != 0)
        .filter(num -> num % 19 != 0)
        .filter(num -> num % 23 != 0)
        .max().orElse(0);

Шаг 3. Выведем ответ:

System.out.println(count + " " + max);
// > 1040 7730

Полный код решения доступен по ссылке.

Вариант решения №3

Шаг 1. Создадим метод проверки числа на соответствие условиям задачи:

private static boolean check(int num) {
    return (num % 5 == 0) && (num % 11 != 0) && (num % 17 != 0) && (num % 19 != 0) && (num % 23 != 0);
}

Шаг 2. Создадим переменные count и max с начальным значением 0 (ноль):

int count = 0;
int max = 0;

Шаг 3. При помощи цикла for организуем перебор всех целых чисел от 1033 до 7737, а методом check() проверим каждое из них на соответствие условиям задачи:

for (int num = 1033; num <= 7737; num++) {
    if (check(num)) {
        count++;
        if (num > max) {
            max = num;
        }
    }
}

Т.к. числа перебираются в порядке возрастания, то проверку if (num > max) { ... (для нахождения максимального значения) можно не выполнять:

for (int num = 1033; num <= 7737; num++) {
    if (check(num)) {
        count++;       
        max = num;
    }
}

Шаг 4. Выведем ответ:

System.out.println(count + " " + max);
// > 1040 7730

Полный код решения доступен по ссылке.