@GoodLuck890

Объясните решение задачи?

Задача:
При ре­ги­стра­ции в ком­пью­тер­ной си­сте­ме каж­до­му поль­зо­ва­те­лю выдаётся па­роль, со­сто­я­щий из 21 сим­во­лов и со­дер­жа­щий толь­ко сим­во­лы A, D, F, H, X, Y, Z (таким об­ра­зом, ис­поль­зу­ет­ся 7 раз­лич­ных сим­во­лов). Каж­дый такой па­роль в ком­пью­тер­ной про­грам­ме за­пи­сы­ва­ет­ся ми­ни­маль­но воз­мож­ным и оди­на­ко­вым целым ко­ли­че­ством байт (при этом ис­поль­зу­ют по­сим­воль­ное ко­ди­ро­ва­ние и все сим­во­лы ко­ди­ру­ют­ся оди­на­ко­вым и ми­ни­маль­но воз­мож­ным ко­ли­че­ством бит). Опре­де­ли­те объём па­мя­ти в бай­тах, от­во­ди­мый этой про­грам­мой для за­пи­си 40 па­ро­лей.

Само решение:
Со­глас­но усло­вию, в но­ме­ре могут быть ис­поль­зо­ва­ны 7 букв. Из­вест­но, что с по­мо­щью N бит можно за­ко­ди­ро­вать 2N раз­лич­ных ва­ри­ан­тов. По­сколь­ку 22 < 7 < 23, то для за­пи­си каж­до­го из 7 сим­во­лов не­об­хо­ди­мо 3 бита.

Для хра­не­ния всех 21 сим­во­лов но­ме­ра нужно 3 · 21 = 63 бита, а т. к. для за­пи­си ис­поль­зу­ет­ся целое число байт, то берём бли­жай­шее не мень­шее зна­че­ние, крат­ное вось­ми, это число 64 = 8 · 8 бит (8 байт).
Тогда 40 па­ро­лей за­ни­ма­ют 8 · 40 = 320 байт.
Ответ: 320
Теперь, у меня такой вопрос: почему мы проводим все это решение, если в условии сказано, что пароль состоит из 21 символа, а не из 7. Я попробовал все это дело на компе и правда, если записать в файл пароль из 7 символов по 40 раз, то получится 320!
Но как я и сказал, что пароль состоит из 21 символа, а не из 7, значит мы должны 21 умножить на 40 (учитывая, что каждый из символов весит по 1 байту) и того мы получаем 840 байт! Все это я тоже записал в файл 21 символ по 40 раз и результат был чуть больше 840 - приблизительно 879
  • Вопрос задан
  • 1083 просмотра
Решения вопроса 1
Adamos
@Adamos
учитывая, что каждый из символов весит по 1 байту

Да, для записи пароля в текстовом виде в однобайтовой кодировке понадобится 21 байт. Это очевидно и без задачи.
Но в ее условии:
па­роль в ком­пью­тер­ной про­грам­ме за­пи­сы­ва­ет­ся ми­ни­маль­но воз­мож­ным и оди­на­ко­вым целым ко­ли­че­ством байт

И вот в этой записи под каждый символ используется только три бита, так что в один байт можно запихнуть два символа с хвостиком, а в 8 байт влезает весь пароль из 21 символа. Просто записываются не сами символы, а их номер в списке - а таких номеров всего 7, а трех байт достаточно, чтобы закодировать числа от 0 до 7.
Вы, видимо, просто по неопытности все равно представляете себе память как байтовое поле, а решение оперирует с битами внутри байтов.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Slavik_Kenny
@Slavik_Kenny
3Д моделлер, и немного всего остального :)
(учитывая, что каждый из символов весит по 1 байту)
Вот тут вы и ошибаетесь.
Именно для того, чтоб пароли занимали меньше места мы и закодировали каждый символ в 3 бита, а не использовали 1 байт - экономия 5 бит на символе.
Тогда на запись одного пароля надо 63 бита, или округляя - 8 байт на пароль, а не как вы считаете 21 байт, по байту на каждый символ, отсюда и финальные 320 байт на 40 паролей.
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
В ответе всё правильно сказано, "Для хра­не­ния всех 21 сим­во­лов но­ме­ра нужно 3 · 21 = 63 бита". То есть 63 бита на один пароль длинной в 21 символ.

Но умножать надо бы 40 паролей на 63 бита, потому что именно такова длина одного пароля. А отвечающий округлил до 64 бит (такое условие задачи), получилось 8 байт.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы