Делителем числа n является любое число, которое равномерно делит n , включая 1 и само n . Число делителей d (n) - это число делителей числа. Вот d (n) для первой пары n:
n divisors d(n)
1 1 1
2 1, 2 2
3 1, 3 2
4 1, 2, 4 3
5 1, 5 2
6 1, 2, 3, 6 4
Мы можем многократно вычитать количество делителей из числа. Например:
16 = 16
16 - d(16) = 16 - 5 = 11
11 - d(11) = 11 - 2 = 9
9 - d( 9) = 9 - 3 = 6
6 - d( 6) = 6 - 4 = 2
2 - d( 2) = 2 - 2 = 0
В этом случае потребовалось 5 шагов, чтобы добраться до 0.
Напишите программу или функцию, которая с неотрицательным числом n возвращает количество шагов, необходимых для ее уменьшения до 0, путем повторного вычитания числа делителей.
Примеры:
0, 0
1, 1
6, 2
16, 5
100, 19
100000, 7534
Ответы:
Желе,
109 байт1 байт благодаря Денису ♦ .
Порт моего ответа в Pyth .
Попробуйте онлайн!
Тестирование.
объяснение
источник
Python, 49 байт
orlp помог сохранить байт! И Sp3000 сохранил еще два. Благодарность!
источник
-~
вn%-~k
и удаляя нижнюю границу диапазона.C, 52 байта
источник
Pyth, 10 байт
Тестирование.
объяснение
источник
Юлия, 31 байт
Простая рекурсивная реализация.
источник
MATL , 14 байтов
Попробуйте онлайн!
объяснение
источник
JavaScript (ES6),
6451 байтНе спрашивайте меня, почему я без необходимости использовал хвостовую рекурсию.
источник
Ява,
14793источник
n=new Integer(100000)
вместоn=100000
?05AB1E,
1210 байтКод:
Объяснение:
Попробуйте онлайн
Редактировать: 2 байта сохранены и ошибка с вводом 0 исправлена благодаря @Adnan
источник
[Ð>#Ñg-¼]¾
. Должен быть способ сделать это короче, хотя ...D0Q#
часть после увеличения счетчика.[Ð>#Ñg-¼]¾
Код должен работать ,0
хотя :).R, 50 байтов
Довольно простая реализация. Попробуйте онлайн
источник
Mathcad, [tbd] байт
Схема эквивалентности байтов Mathcad еще не определена. Используя грубую эквивалентность нажатий клавиш, программа использует около 39 «байтов». Обратите внимание, что операторы while и for программируют только одну операцию на клавиатуре для ввода (ctl-] и ctl-shft- # соответственно) - действительно, они могут быть введены таким образом только с клавиатуры.
То, что вы видите, это именно то, что записано на листе Mathcad. Mathcad оценивает уравнения / программы и размещает выходные данные на одном листе (например, после оператора оценки '=' или на графике).
источник
MATL, 13 байт
Попробуйте онлайн
Объяснение:
источник
Mathematica, 35 байт
Использование старого доброго
DivisorSigma
. @ MartinBüttner отмечает следующие альтернативы:источник
Хун ,
9376 байтUngolfed:
Возвращает функцию , которая принимает атом
r
. Создайте промежуточное значение, которое содержит все отклоненияr
(Составьте список [1..n], оставьте только те элементы, где (mod ri) == 0). Еслиr
ноль, вернуть ноль, иначе вернуть увеличенное значение рекурсии с r, равным r- (делители длины).Код как есть занимает глупое количество времени для оценки при n = 100.000, полностью потому, что поиск девиаторов для больших чисел создает гигантский список и отображает его. Запоминание делителей дает правильный вывод для n = 10.000, но я не стал ждать 100.000
источник
Haskell,
434039 байтПростой рекурсивный подход. Пример использования:
g 16
->5
.Редактировать: @Lynn сохранил
34 байта. Благодарность!источник
g(sum$signum.mod n<$>[1..n])
?min 1
на самом деле на один байт корочеsignum
, дажеPowerShell v2 +,
7467 байтКажется довольно длинным по сравнению с некоторыми другими ответами ...
Принимает ввод
$n
, входит вfor
цикл с условием,$n
которое больше, чем0
. Каждую итерацию цикла мы устанавливаем помощником$a
, затем перебираем каждое число от1
до$n
. Каждый внутренний цикл мы проверяем по каждому числу, чтобы увидеть, является ли он делителем, и если это так, мы увеличиваем наш помощник$a
(используя логическое отрицание и неявное приведение к int). Затем мы вычитаем количество найденных делителей$n-=$a
и увеличиваем наш счетчик$o++
. Наконец, мы выводим$o
.Выполнение занимает много времени, так как это существенная конструкция цикла for. Например, запуск
n = 10,000
на моей машине (1-летний Core i5) занимает почти 3 минуты.источник
Ракетка -
126 байт До 98 байт91 байтЧрезвычайно наивное решение - вероятно, можно было бы много сократить с помощью приличного алгоритма и некоторых хитростей, которые я не знаюИзменить: объяснение по запросу. Как я уже сказал, это чрезвычайно наивное рекурсивное решение и может быть намного короче.
Редактировать 2: 98-байтовую версию с менее глупым алгоритмом (хотя он все еще довольно тупой и может быть короче)Объяснение:Редактировать 3: Сохранено 7 байтов путем замены
(cdr(build-list x values))
на(build-list x add1)
источник
> <> , 52 + 2 = 54 байта
Входной номер должен присутствовать в стеке при запуске программы, поэтому для
-v
флага есть +2 байта . Попробуйте онлайн!4 раздражающих байта потрачены впустую на вопросы выравнивания. Ба.
Этот работает путем построения последовательности от
n
до0
в стеке. Как только 0 будет достигнуто, вытолкните его и выведите длину оставшегося стека.Кстати, он работает
O(n^2)
вовремя, поэтому я бы не стал пытатьсяn = 100000
...источник
-v
один байт, а не два.> <> , 36 + 3 = 39 байт
Реализация относительно проста, с каждой итерацией
sum(n%k>0 for k in range(1,n-1))
. +3 байта за-v
флаг, за мета .Попробуйте онлайн!
источник
Рубин, 42 байта
В самом большом тестовом примере есть ошибка переполнения стека
100000
, так что вот итерационная версия в пределах 49 байтов . Хотя и требует времени, учитываяO(N^2)
сложность.источник
Perl 5, 40 байт
Ввод и вывод в виде списков необходимого количества копий
1
.источник
C #, 63 байта
источник
На самом деле, 17 байтов
Попробуйте онлайн! (примечание: время последнего теста на TIO истекло)
Объяснение:
источник