Информатика

Обработка массива: задания №17 и №25

№17, №2525 мин4 заданий с автопроверкой

Обработка массива: задания №17 и №25

В файле дан набор целых чисел. Рассмотрите все пары элементов, стоящих на разных местах в файле (порядок внутри пары не важен, значения элементов пары могут совпадать), сумма которых кратна 5. Найдите количество таких пар и максимальную из их сумм.

17-data.csv569 Б
with open('17-data.csv') as f:
    nums = [int(line) for line in f]

# Если перебирать все пары чисел, это O(n^2): на файле с миллионом строк —
# не уложиться во время экзамена. Сумма двух чисел кратна 5 только тогда,
# когда их остатки от деления на 5 в сумме дают 0 или 5 — то есть подходят
# только три комбинации остатков: (0,0), (1,4), (2,3). Достаточно один раз
# пройти по файлу и для каждого остатка запомнить, сколько чисел его дают
# и два самых больших числа среди них (второе — на случай пары 0+0).
count_by_rem = [0] * 5
top1 = [None] * 5
top2 = [None] * 5

for x in nums:
    r = x % 5
    count_by_rem[r] += 1
    if top1[r] is None or x > top1[r]:
        top1[r], top2[r] = x, top1[r]
    elif top2[r] is None or x > top2[r]:
        top2[r] = x

count = 0
max_sum = None

c0 = count_by_rem[0]
count += c0 * (c0 - 1) // 2
if c0 >= 2:
    max_sum = top1[0] + top2[0]

for r in (1, 2):
    other = 5 - r
    count += count_by_rem[r] * count_by_rem[other]
    if count_by_rem[r] and count_by_rem[other]:
        s = top1[r] + top1[other]
        if max_sum is None or s > max_sum:
            max_sum = s

print(count)
print(max_sum)

Определите количество пар элементов массива из файла, стоящих на разных местах (порядок внутри пары не важен), сумма которых кратна 5, и максимальную сумму среди таких пар.

ШагЧисло xx mod 5Счётчик остаткаМаксимум остатка
132831328
25832328
31333328
438001380
514111141

Восстановите порядок этапов решения задачи №17

  1. Вывести результат
  2. Посчитать количество подходящих пар и максимальную сумму
  3. Прочитать все числа из файла
  4. Разложить числа по остаткам от деления на 5

Найдите наименьшее натуральное число, у которого ровно 15 различных натуральных делителей (включая 1 и само число).

Массив a пронумерован с 1 по n. Программа: строка 1 — for i := 1 to n do; строка 2 — if (a[i] + a[i + 1]) mod 5 = 0 then; строка 3 — count := count + 1. Какая строка выходит за границу массива?

Объясните, почему решение через подсчёт чисел по остаткам от деления на 5 работает за O(n), а перебор всех пар элементов — за O(n²). Что произойдёт со временем работы каждой из программ, если размер файла увеличить в 10 раз?

Объём: от 30 слов

0 / от 30 слов

Типичная ошибка: забывают, что условие «пара» не включает элемент сам с собой. При подсчёте пар с одинаковым остатком 0 нельзя брать c₀² или c₀ · (c₀ − 1) — оба варианта либо считают пару числа с самим собой, либо считают каждую пару дважды (сначала как (a, b), потом как (b, a)). Верная формула — c₀ · (c₀ − 1) / 2: столько есть способов выбрать два элемента, стоящих на разных местах, из c₀ элементов с таким остатком, не важно в каком порядке.