Этот недавний код для игры в гольф задал возможности быстрой реализации на C следующим (предполагая, что n
является целым без знака):
if (n==6 || n==8 || n==10 || n==12 || n==14 || n==16 || n==18 || n==20)
Одно из возможных упрощений состоит в том, чтобы заметить, что числа a[]={6,8,10,12,14,16,18,20}
образуют арифметическую прогрессию , поэтому меняя диапазон, а затем используя побитовые трюки
if (((n - 6) & 14) + 6 == n)
приводит к более короткой (и, вероятно, более эффективной) реализации, поскольку ответил Джоном Боллинджером.
Теперь я спрашиваю, что является аналогичной элегантной (и, надеюсь, одинаково эффективной) реализацией
if (n==3 || n==5 || n==11 || n==29 || n==83 || n==245 || n==731 || n==2189)
Подсказка: на этот раз цифры a[k]
образуют геометрическую прогрессию: a[k]=2+3^k
.
Я предполагаю, что в общем случае нельзя сделать лучше, чем сортировать числа a[k]
, а затем выполнить логарифмический поиск, чтобы проверить, является ли n
членом отсортированного массива.