К содержанию

Подтема 3 из 7

Сколько чисел группы подходит

Как проверить «хотя бы одно», «ровно одно» и «не более двух из трёх» — часть задачи темы про четырёхзначные числа.

И, или, не

Как соединить несколько проверок?

требует, чтобы выполнились обе проверки, or — хотя бы одна, а not меняет ответ на противоположный. Проверим пары на свойство «число делится на 3»:

Параx % 3 == 0 or y % 3 == 0x % 3 == 0 and y % 3 == 0
(6, 5)данет
(5, 9)данет
(6, 9)дада
(5, 7)нетнет

«Хотя бы одно» допускает, что подходят оба: пара (6, 9) подходит. Если нужно, чтобы делилось только одно число, это «ровно одно» — его разберём ниже.

Четырёхзначные числа

Какие из восьми чисел темы четырёхзначные?

Минус — не цифра: −1250 тоже четырёхзначное. Поэтому проверяют модуль: 1000 <= abs(x) <= 9999. Четырёхзначные у нас 1300, −1250, −2100, 2025 и 3000. Проверка без модуля пропустит −1250 и −2100: они меньше 1000.

for x in [1300, -1250, 7, 3000]:    print(x, 1000 <= x <= 9999, 1000 <= abs(x) <= 9999)
1300 True True -1250 False True 7 False False 3000 True True

Сколько чисел подходит

Как проверить «не более двух из трёх элементов — четырёхзначные»?

Посчитай, сколько чисел тройки обладают свойством, и сравни это количество с числом из условия. Проверка даёт True или False, а int(True) = 1, int(False) = 0. Сложив три проверки, получим количество. Чтобы не повторять длинную проверку трижды, дадим ей имя — four:

def four(x):    return 1000 <= abs(x) <= 9999  k = int(four(1300)) + int(four(-1250)) + int(four(-2100))print(k, k <= 2)
3 False

def задаёт имя проверки, return — её ответ. В тройке 1300, −1250, −2100 все три числа четырёхзначные, и условие «не более двух» не выполнено. Любая формулировка про количество переводится так же:

ни одного подходящего числа
k == 0
ровно одно
k == 1
ровно два
k == 2
все три
k == 3
хотя бы одно
k >= 1
хотя бы два
k >= 2
не более одного
k <= 1
не более двух
k <= 2подходят 0, 1 или 2 — не только 2
есть подходящие, но не все
0 < k < 3

Посчитаем k для всех троек темы:

ТройкаЧетырёхзначныхk <= 2Сумма
125, 1300, −12502да175
1300, −1250, −21003нет−2050
−1250, −2100, 72да−3343
−2100, 7, −3251да−2418
7, −325, 20251да1707
−325, 2025, 30002да4700

Вместе с условием «сумма не больше 2025» подходят четыре тройки: вторая не проходит по четырёхзначным, последняя — по сумме. Наибольшая сумма по-прежнему 1707. В программе обе проверки соединяет and, а запись x, y, z = a[i], a[i + 1], a[i + 2] даёт имена трём числам тройки сразу:

def four(x):    return 1000 <= abs(x) <= 9999  a = [125, 1300, -1250, -2100, 7, -325, 2025, 3000]sums = []for i in range(len(a) - 2):    x, y, z = a[i], a[i + 1], a[i + 2]    k = int(four(x)) + int(four(y)) + int(four(z))    if k <= 2 and x + y + z <= 2025:        sums.append(x + y + z)print(len(sums), max(sums))
4 1707

Скобки

Почему длинное условие иногда работает не так, как написано в задаче?

and выполняется раньше or, поэтому часть условия с or берут в скобки. Пусть нужно: «хотя бы одно число пары делится на три, а сумма пары больше 100». Проверим на паре (9, 20) с суммой 29:

x = 9y = 20print((x % 3 == 0 or y % 3 == 0) and x + y > 100)print(x % 3 == 0 or y % 3 == 0 and x + y > 100)
False True

Без скобок Python сначала проверил y % 3 == 0 and x + y > 100, и делимости 9 на три хватило, хотя сумма меньше 100. Длинное условие удобно разбить на части с именами: has_multiple = x % 3 == 0 or y % 3 == 0, large_sum = x + y > 100, затем if has_multiple and large_sum:.

Одно…, а другое…

Чем «хотя бы одно делится на три, и хотя бы одно меньше 10» отличается от «одно делится на три, а другое меньше 10»?

«Одно…, а другое…» требует, чтобы свойства были у двух разных чисел пары. Возьмём пару (3, 100). Число 3 и делится на три, и меньше 10, а 100 — ни то, ни другое. Вот три похожие формулировки:

  • «хотя бы одно делится на три, и хотя бы одно меньше 10» — (x % 3 == 0 or y % 3 == 0) and (x < 10 or y < 10): оба свойства может дать одно число;
  • «одно делится на три, а другое меньше 10» — (x % 3 == 0 and y < 10) or (y % 3 == 0 and x < 10): проверяют оба распределения ролей;
  • «хотя бы одно одновременно делится на три и меньше 10» — (x % 3 == 0 and x < 10) or (y % 3 == 0 and y < 10): оба свойства у одного числа.
Пара (3, 100) как таблица «число × свойство». Слева «да» есть в каждом столбце. В середине нужны два разных числа — одно кратно 3, другое меньше 10, — и ни одно распределение ролей не подходит. Справа оба свойства у одного числа 3. Подходят первая и третья формулировки.

Если оба числа обладают обоими свойствами, «одно…, а другое…» тоже выполнено: роли можно распределить любым способом. Пара при этом считается один раз — у нас одна проверка с or.

Итого

  • and, orобе проверки — хотя бы одна
  • Хотя бы однодопускает, что подходят оба
  • Четырёхзначное1000 <= abs(x) <= 9999
  • Количествоk = int(…) + int(…) + int(…)
  • Не более двухk <= 2; «не менее двух» — k >= 2
  • Скобки(… or …) and …
  • Одно…, а другое…два распределения ролей через or

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Свойство — «число кратно трём». Какие из пар (12, 7), (7, 8), (3, 30), (5, 21) подходят под «хотя бы одно», какие — под «оба», какие — под «ровно одно»?
ОтветСкрыть ответ
Ответ
«Хотя бы одно» — (12, 7), (3, 30), (5, 21); «оба» — (3, 30); «ровно одно» — (12, 7) и (5, 21). Пара (7, 8) не подходит никуда.
Вопрос 2
Какие из чисел 999, −1000, 9999, −10000, 2025 четырёхзначные?
ОтветСкрыть ответ
Ответ
−1000, 9999 и 2025: минус — не цифра.
Вопрос 3
Пусть k — количество чётных чисел тройки. Переведи через k: «не менее двух чётных», «есть чётные, но не все», «ни одного чётного», «не более одного чётного».
ОтветСкрыть ответ
Ответ
k >= 2, 0 < k < 3, k == 0, k <= 1.
Вопрос 4
Чему равно x % 5 == 0 or y % 5 == 0 and x + y > 50 для пары (10, 12)? А правильная запись условия «хотя бы одно число кратно пяти, а сумма больше 50»?
ОтветСкрыть ответ
Ответ
True: Python сначала вычисляет and, а 10 делится на пять. Правильная запись (x % 5 == 0 or y % 5 == 0) and (x + y > 50) даёт False: сумма 22.
Вопрос 5
Пара (12, 4), T = 10. Проверь три условия: «хотя бы одно делится на три и хотя бы одно меньше T», «одно делится на три, а другое меньше T», «хотя бы одно одновременно делится на три и меньше T».
ОтветСкрыть ответ
Ответ
Да, да, нет: 12 делится на три, 4 меньше десяти, но ни одно число не обладает обоими свойствами сразу.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Пары с чётным числом

Последовательность 4, 7, 10, 3, −2. Найди количество соседних пар, где хотя бы одно число чётное, и максимальную сумму таких пар.

Введите через пробел количество пар, затем максимальную сумму.

Тройки: два трёхзначных, сумма кратна 4

Для файла 17-1.txt определите количество троек, в которых ровно два числа трёхзначные по модулю, а сумма элементов тройки кратна 4, затем минимальную из сумм элементов таких троек. Под тройкой подразумевается три идущих подряд элемента последовательности.

17-1.txtПоследовательность целых чисел от −10 000 до 10 000Текстовый файл · 4,3 КБ

Введите через пробел количество троек, затем минимальную сумму.

Ровно одно и хотя бы одно

Для файла 17-1.txt определите количество чисел, которые делятся ровно на одно из чисел 4 и 6, затем количество чисел, которые делятся хотя бы на одно из них. В ответе запишите два числа.

17-1.txtПоследовательность целых чисел от −10 000 до 10 000Текстовый файл · 4,3 КБ

Введите через пробел количество чисел, кратных ровно одному из чисел 4 и 6, затем — хотя бы одному.

Хотя бы два делителя из трёх

Для файла 17-1.txt определите, сколько чисел делятся хотя бы на два из чисел 2, 3 и 5.

17-1.txtПоследовательность целых чисел от −10 000 до 10 000Текстовый файл · 4,3 КБ

Введите число.

Тройки с двумя трёхзначными

Последовательность 100, 5, 200, 300, 7, 400. Найди количество соседних троек, где ровно два числа трёхзначные, и максимальную сумму таких троек.

Введите через пробел количество троек, затем максимальную сумму.