В банке задание 11 встречается и в обратную сторону: алфавит задан условием, а длину записи надо найти.
Условие. На предприятии каждой изготовленной детали присваивают серийный номер, содержащий десятичные цифры и символы из 17-символьного специального алфавита. В базе данных каждый серийный номер занимает одинаковое и минимально возможное число байт. При этом используется посимвольное кодирование серийных номеров, все символы кодируются одинаковым и минимально возможным числом бит. Известно, что для хранения 7 564 230 серийных номеров требуется более 31 Мбайт памяти. Определите минимально возможную длину серийного номера.
- Соберите алфавит. Десятичных цифр 10, специальных символов 17 – всего $10 + 17 = 27$. Ищем минимальное $i$, при котором $2^i \ge 27$: $2^{4} = 16$ мало, $2^{5} = 32$ хватает. Значит на символ уходит $i = 5$ бит.
- Переведите память в байты. 31 Мбайт – это $31 \cdot 1024 \cdot 1024 = 32505856$ байт.
-
Поделите на число номеров. $32505856 / 7564230 = 4{,}30$ байт на один номер. Байт – число целое, значит на номер уходит либо 4, либо 5. Какое из двух – проверьте прямо по условию:
- по 4 байта: вся база займёт $4 \cdot 7564230 = 30256920$ байт. Это меньше 31 Мбайт, то есть 32505856 байт. А в условии сказано «требуется более». Не подходит;
- по 5 байт: $5 \cdot 7564230 = 37821150$ байт – это больше 32505856. Подходит.
Значит на один номер уходит 5 байт.
-
Подберите длину. Запись из $L$ символов занимает $\lceil 5 \cdot L / 8 \rceil$ байт. При $L = 6$ выходит 4 – мало, нужно не меньше 5. При $L = 7$ – 5, и это первая длина, которая проходит.
Ответ: 7.
Сравните с примером 1: там «не более» отбросило дробь вниз и дало 78 байт на номер, здесь «более» округлило вверх и дало 5. Арифметика одна и та же – разошлось только направление, которое задаёт одно слово условия.