АлгоритмыОпределение четности числа

Предлагаю публиковать в этом разделе свои алгоритмы определения четности числа представленного в уравновешенном троичном коде. Есть мнение что их количество больше двух (уже известных мне). Если нужна подсказка то она звучит на первый взгляд странно: четным называется число у которого четно количество ненулевых разрядов.

Бармалейкин,

Мнения

  • 001vic

    Простите за то, что немного не по существу. За флуд то есть...
    Меня восхитила троичная логика, её некторые свойства. Однако человеку, всю сознательную жизнь имевшему дело с бинарной логикой, трудно это воспринимать. А после прочтения первого поста начал сомневаться в вещах очевидных - четное число, это то, которое без остатка делится на 2? (два - это 1+1)
    А вообще непонятно каким местом чувтсвую, будущее именно за этим.

    • 002Бармалейкин

      Да, в десятичной системе четным числом называется число, которое делится на 2 без остатка. В двоичной системе четность определяется одним из двух способов, наиболее часто применяемый из которых - проверка состояния самого младшего разряда (правда, при этом получается некоторая странность - ноль обретает свойство четности).
      В троичной системе счисления подобный способ не будет действовать.

  • 003Serg

    Не совсем понятно определение "четным называется число у которого четно количество ненулевых разрядов". В такой формулировке оно рекурсивно, поэтому необходимо граничное условие.
    Например число -+0+00--0 содержит +-- ненулевых разрядов, которое в свою очередь содержит 0 ненулевых разрядов (и что дальше...)

  • 004Alexander ObukhovТринари

    Обозначим чётное число знаком +,
    нечётное знаком -,
    нулевое соотвествено 0.
    Изначально считаем что число 0.
    Затем поразрядно определяем значение каждого разряда.
    После первого разряда отличного от 0 уставливаем результат в -,
    а после каждого следующего разряда отличного от 0 инвертируем результат.
    Таким образом после обхода всех разрядов получаем значение "-" для нечётного, "+" для чётного и 0 для нулевого числа.

    • 006Alexander ObukhovТринари

      Однако в двоичных системах определение чётности намного проще: достаточно проверить младший разряд, если 0 — чётно, 1 — нечётно.

      • 007Бармалейкин

        Да, если не обращать внимания на чётный ноль.

          • 009Serg

            Если для определения четности числа надо просмотреть все символы, то быстрее прямого перебора ничего нет

              • 011Serg

                Строка="Текст ,который надо зачем-нибудь перебрать"
                ДлинаСтроки=Строка.КоличествоСимволов()
                Для к=0 по ДлинаСтроки Цикл
                //делаем что-нибудь с каждый символом
                КонецЦикла

                • 012Alexander ObukhovТринари

                  Мне думается, такой подход подойдет в основном для языков высокого уровня

                  • 014Alexander ObukhovТринари

                    Во многих языках рекурсия более ресурсоёмкая чем цикл,
                    да и к чему здесь рекурсия?
                    Да и с циклом надо бы разрешать — чтобы было за одно действие :)

  • 015Андрей Куликов

    При записи троичных чисел цифрами 0, 1 и 2, если сумма всех цифр троичного числа чётна, то и троичное число чётно.

    • 016Alexander ObukhovТринари

      Как уже было выше сказано такая формулировка рекурсивна (чтобы определить чётность числа надо определить чётность результата).
      Независимо от обозначения (а также симметричная или нет система), в троичной системе счисления определить чётность числа можно по следующему алгоритму:
      Обозначим чётное число знаком «+» (2),
      нечётное знаком «-» (1),
      нулевое соответственно 0.
      Изначально считаем, что результат 0 (т.е. число равно 0).
      Затем поразрядно определяем значение каждого разряда.
      После первого разряда отличного от 0 устанавливаем результат в «-» (1),
      а после каждого следующего разряда отличного от 0 инвертируем результат (например был «-» (1), меняем на «+» (2), или наоборот).
      Таким образом, после обхода всех разрядов получаем значение «-» (1) для нечётного, «+» (2) для чётного и 0 для нулевого числа.

      • 017Alexander ObukhovТринари

        Выше утверждение неточно.
        Для не симметричной троичной системы алгоритм будет отличаться.
        Изначально также считаем что число 0.
        Затем поразрядно определяем чётность:
        если первый не нулевой разряд = 2, записываем результат 2,
        если первый не нулевой разряд = 1, записываем результат 1.
        После чего обходим остальные разряды — если разряд = 1 то инвертируем результат (2 на 1, 1 на 2).
        В результате получим 2 для чётного, 1 для нечётного, 0 для 0.

            • 020Андрей Куликов

              Алгоритмы проверяемы, поэтому желающие могут сами проверить и убедиться, где правда, а где ложь.

            • 023Анонимный

              Выше блока 017 два блока - 016 и 015, поэтому высказывание в блоке 017 - неоднозначно. Комментарий Naty устраняет эту неоднозначность, за что ей и спасибо.

              • 024Alexander ObukhovТринари

                Вообще-то комментировался блок 016, поэтому всё однозначно.