Обработка массива: задания №17 и №25
Обработка массива: задания №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, и максимальную сумму среди таких пар.
| Шаг | Число x | x mod 5 | Счётчик остатка | Максимум остатка |
|---|---|---|---|---|
| 1 | 328 | 3 | 1 | 328 |
| 2 | 58 | 3 | 2 | 328 |
| 3 | 13 | 3 | 3 | 328 |
| 4 | 380 | 0 | 1 | 380 |
| 5 | 141 | 1 | 1 | 141 |
Восстановите порядок этапов решения задачи №17
- Вывести результат
- Посчитать количество подходящих пар и максимальную сумму
- Прочитать все числа из файла
- Разложить числа по остаткам от деления на 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₀ элементов с таким остатком, не важно в каком порядке.