Вы не находите странным, что некоторые "почти равные" числа записываются абсолютно по-разному? Например, в десятичной системе счисления числа `29` и `30` отличаются всего на единицу, но их запись не содержит ни одной общей цифры. Во избежание такой ситуации код АЛФАВИТ предлагает запись чисел последовательностью нулей и единиц: Десятичная система счисления: `|0|1|2|3|4|5|6|7|8` АЛФАВИТ: `| 0 | 1 | 11 | 10 | 110 | 111 | 101 | 100 | 1100` Правило построения следующего числа в коде АЛФАВИТ таково: в предыдущем числе нужно изменить крайний правый символ, если это возможно, если нет — приписать слева единицу. (a) Какому числу в десятичной системе счисления соответствует запись в АЛФАВИТе `111111`? (b) Какое число следует за ним в этом коде? (c) Опишите алгоритм, рассчитывающий для каждого числа в коде АЛФАВИТ число, следующее за ним.
| 
|
Это всегда возможно. Если имеется ввиду «если для получения предыдущего числа цифра не менялась», то возникают вопросы по формальному описанию соответствия десятичных цифр строкам АЛФАВИТа — `6 != 5 + 1`, в частности.
Или я чего-то не понимаю в действии оператора `+ 1`?
Это всегда возможно.
Это мой корявый перевод. (
Тем не менее, претензия на взаимное соответствие слов АЛФАВИТа натуральным числам есть.
У нас есть достаточно данных для построения строгой аксиоматики над этими словами — `1 \in `АЛФАВИТ*, `S(n) \in`АЛФАВИТ*, вполне упорядоченность (откуда — индукция). Так что формализация эквивалентна аксиомам Пеано или построению непредельных ординалов.
Получается, вопросы (а) и (b) не имеют смысла...
(без оптимизации кода, VS C++ 2012, /O2)
Вывод:
Тогда `(((n + 1) + 1) + 1) + 1 = 11 \oplus n`; тогда последний символ нужно менять в том и только в том случае, когда `\text{len} (n) + \text{ld} (n)` четно; `\text{len} (\cdot)` и `\text {ld} (\cdot)` — функции, возвращающие длину строки `n` и ее крайний правый символ соответственно.
в предыдущем числе нужно изменить крайний правый символ, если это возможно, если нет — приписать слева единицу.
В предыдущем числе нужно изменить первую справа цифру, изменение которой даст число, которого еще не было. Если ни одной цифры при таком условии изменить нельзя, то ....... (далее по тексту).
Приношу извинения за неверный перевод.
Приношу извинения за неверный перевод.
Ничего страшного.
Пример алфавита не удовлетворяет этому требованию.
Алфавит в задаче - пример кода, в котором соседние числа отличаются только одним битом.
Переход из N битных слов в N+1 битные осуществляется только тогда, когда N-битные комбинации исчерпаны.
Вообще говоря, существует много способов написать такой код, но есть один с определённой закономерностью (именно он дан в примере). И он даже специальное название имеет в АТК.
Практическое применение этого кода - допустим, у нас есть N бинарных переключателей. Нужно проверить все комбинации, при этом минимизировать число переключений.
Переход из N битных слов в N+1 битные осуществляется только тогда, когда N-битные комбинации исчерпаны.
А вот это я доказать не смог =) Полнота (т.е. равенство АЛФАВИТ = {0, 1}*) сразу ведет к симметричности относительно «предельных» чисел (т.е. таких, после которых идет переход длины) с изменением ведущего бита; откуда формула для преобразования бинарного представления в код: Gray (n) = n ⊕ [n / 2]. Отсюда уже несложно получить формулу обратного преобразования — n = Gray (n) ⊕ [Gray (n)/2] ⊕ ... ⊕ [Gray (n)/2k].
я знаю.
А вот это я доказать не смог
доказать исходя из каких условий? В коде Грея это выполняется. А условие в данной задаче не соответствует примеру, следовательно - где-то неточность.
Вместо
изменить крайний правый символ, если это возможно...
следует читать
первую справа цифру, изменение которой даст число, которого еще не было. Если ни одной цифры при таком условии изменить нельзя, то...
В такой формулировке это код Грэя, а вот доказать соответствие у меня пока не получилось.