Как определить, является ли число нечетным или четным без мод-или-побитовых операций?
Эта задача крайне неэффективна, но ставит под сомнение вашу способность мыслить нестандартно для творческого решения.
РЕДАКТИРОВАТЬ :
Пожалуйста, создайте функцию. Кроме того, хотя регулярное выражение является забавным ответом, функция должна принимать любое допустимое число.
ПРЕДПОСЫЛКИ : Этот вопрос связан с моими самыми ранними днями программирования. Домашняя работа для нашего первого дня класса состояла в том, чтобы написать простую программу, которая напечатала бы «нечетный» или «четный». Будучи ребёнком, которым я был, я не читал книгу, которую мы имели для класса, где он просто показал нам, как использовать это,%
чтобы определить это. Я провёл около получаса в своей комнате, пытаясь придумать, как это сделать, и из лекции вспомнил, что числа могут терять и приобретать точность, когда они преобразуются из одного примитивного типа в другой. Поэтому, если вы взяли число, поделили его на два, а затем умножили на обратное, не равное исходному числу, то вы бы знали, что число нечетное.
На следующий день я был ошеломлен, когда наш инструктор оценивал наши программы, и он думал, что это самый оригинальный, хотя и неэффективный, способ решения проблемы.
источник
Ответы:
В большинстве языков программирования деление возвращает частное для целых чисел. Так что вы можете просто проверить это
источник
int
/long
typefloor()
. Это прекрасно работает в C и C ++.питон
источник
Брейнф *** (179)
Это одна из наиболее интересных проблем, связанных с условной логикой, которую я сделал в BF.
Требуется ввод текста с номером. Если число четное, оно выводит
E
, а если нечетное, выводитсяO
.Я горжусь этим достаточно, чтобы показать более читабельную форму:
источник
Mathematica
источник
I
иPi
вместоi
иpi
.С
Умноженное само по себе несколько раз, любое четное число будет переполнено до 0, если задано целое число конечного размера, и любое нечетное число будет по-прежнему иметь как минимум младший значащий бит.
Редактировать: как простая функция:
источник
Python (медленно)
источник
abs()
вызов в начале.JavaScript
дает
true
четное число. Это работает только с целыми числами разумного размера (например, не с научной нотацией при преобразовании в строку и без дробной части.)источник
/[02468]$/.test
./[02468]$/.test('I am a fake even number 0')
. В этом случае вы могли бы сделать/^[0-9].[02468]$/.test(i)
/-?^\d*[02468]$/
будет немного строже, чем ваше регулярное выражение. Вам потребуется больше работы, чтобы это работало правильно для чисел, которые toString'ed с использованием научной записи.питон
Поскольку я не совсем уверен, каковы критерии оценки, вот несколько решений, которые я предложил для развлечения. Большинство из них используют
abs(n)
для поддержки отрицательных чисел. Большинство из них, если не все, никогда не должны использоваться для реальных расчетов.Этот скучный
И это мой фаворит, хотя, к сожалению, он не работает (как указывает март Хо ниже: только то, что все четные числа являются суммой двух простых чисел, не означает, что все нечетные числа не являются).
источник
Haskell
Это, конечно, ни в коем случае не творческое, нестандартное решение, которое вы ищете, но сколько раз я собираюсь опубликовать ответ на Haskell короче, чем GolfScript, правда? Это действительно позор, это не код гольф.
Но более серьезно:
источник
odd
), который является встроенной функцией, которая возвращает True, если число нечетное. Это полный ответ сам по себе и короче, чем текущий ответ GolfScript (который на момент написания составляет 10 символов, но я ожидаю, что это снизится). Вопрос также немного недооценен, поэтому я утверждаю, что этогоodd
достаточно. Это также может измениться.parity
алгоритм работает на всехNum
экземплярах, которые являются целыми числами. Это горячо! Хотя я бы наверное сделалevens = [0,2..] >>= \n -> [-n, n]
. Похоже на шансы.Использование заведомо извращенное чтение вопроса, «Как определить , является ли число четным или нечетным», вот реализация C (предположим ,
bool
иtrue
определяются соответственно):источник
0.5
возвращается,true
когда не должно быть.Что, никаких рандомизированных алгоритмов еще нет?
С
Случайно парные числа в диапазоне 0 .. n -1, пока не осталось менее 2. Это довольно удивительно неэффективно: O ( п 3 ).
Полностью отличается:
Haskell
Использует тот факт, что преобразование Фурье четной функции (например,
\x->x^^4
) является действительным, в то время как преобразование Фурье нечетной функции является мнимым.источник
Windows PowerShell
Нет побитовых операторов, нет модуля, как требуется.
источник
Coq, 103
Насколько я могу судить, это первая запись coq на codegolf.
Еще короче (59):
источник
Рубин
Если вы хотите распечатать результат:
источник
.odd?
определении.Unlambda
Мир нуждается в большем количестве Unlambda.
Unlambda имеет преимущество убийца здесь: его значение по умолчанию ( гм ) для чисел - это церковные цифры, поэтому все, что нужно, это применить их к двоичной функции, а не к функции true. Легко!
PS: Markdown и Unlambda определенно не созданы друг для друга.
Проверка первых нескольких целых чисел:
источник
Golfscript
источник
питон
Аналогичная производительность для более ранней версии. Работает на 0 сейчас.
Неверная более ранняя версия:
Не особенно эффективно; время и память, очевидно, O (n): 32 мсек на 1000000; 2,3 мс на 100000; 3.2 usec за 100. Работает с отрицательными числами. Выдает ошибку для 0, потому что 0 не является ни четным, ни нечетным.
источник
Fractran
применительно к
дает либо
5
ifn
нечетное, либо1
ifn
четное.Обновление : намного короче, но не так интересно:
это
2
для нечетныхn
и1
для четныхn
.источник
MMIX (4 байта)
Это своего рода обман. Я не использую ни мод, ни битовые операции. Скорее, тестирование на нечетные / четные числа встроено. Предполагая, что
$3
содержит число для проверки и результат входит в$2
:наборы
$2
к ,1
если$3
даже и в противном0
случае. МнемнорикаZSEV
означает чётное множество и имеет следующую семантику:Для приведенной выше строки
mmixal
генерирует эти четыре байта сборки:источник
Схема
Это самое неэффективное решение, которое я знаю.
источник
Perl
Как насчет
источник
JavaScript, 36
Возвращает
true
если даже,false
если нет.источник
Perl
источник
питон
тестирование квадрата я, так что это работает и для отрицательных чисел
источник
F #
Взаимная рекурсия на победу.
Число n является четным, если оно равно нулю или (n-1) нечетно.
Число n нечетно, если оно не равно нулю, а (n-1) четно.
(добавляется abs, если кто-то заинтересован в соотношении отрицательных чисел)
источник
Clojure
источник
Что квалифицируется как побитовые операции? Под капотом целочисленное деление на 2, вероятно, будет реализовано как сдвиг битов.
Предполагая, что сдвиги не сданы:
C / C ++
edit Пропущены некоторые скобки, и в конечном итоге изменено, чтобы убрать сдвиг, чтобы сделать его меньше. Вы можете проверить это с помощью следующего (в * nix):
... хотя в Linux / tcsh мне пришлось избежать обратной косой черты на
\n
хотя она была в одинарных кавычках. Я тестировал в little & big-endian, он работает правильно в обоих случаях. Кроме того, я вручную скопировал это; компьютер, на котором я публикую сообщения, не имеет компилятора, поэтому он может содержать ошибки.x86 asm
,
или
или
... с последующим:
В качестве альтернативы, сдвиг и сравнение могут быть выполнены таким образом:
источник
shl
и друзья запрещены ...На процессоре 68000 вы можете переместить значение слова с адреса, определенного значением, для проверки:
и пусть аппаратная ловушка для ошибки адреса определяет нечетный / четный характер значения - если возбуждается исключение, значение было нечетным, если нет, значение было четным:
Не работает на процессорах Intel x86, так как они более гибки в доступе к данным.
источник
питон
Я решил попробовать самое уродливое и запутанное решение, которое только мог придумать:
Печатает e если четно, o если нечетно.
источник
Q
Продолжайте вычитать 2 до x <2, а затем конвертировать в bool
источник