рэкет , 83 79 байт
(λ(n)(cadr(argmax cadr((let()(local-require math/number-theory)factorize)n))))
Попробуйте онлайн!
(Я не уверен, что существует консенсус относительно того, что представляет собой полное решение Racket, поэтому я придерживаюсь соглашения Mathematica, что чистая функция считается.)
Как это работает
factorize
дает факторизацию как список пар: (factorize 108)
дает '((2 2) (3 3))
. Второй элемент пары задается cadr
как сокращение для композицииcar
(заголовок списка) сcdr
(хвост списка).
Я чувствую себя глупо, (cadr (argmax cadr list))
чтобы найти максимум вторых элементов, ноmax
не работает со списками:(max (map cadr list))
не делает то, что мы хотим. Я не эксперт в Racket, поэтому, возможно, есть стандартный лучший способ сделать это.
Ракетка, 93 байта
(λ(n)(define(p d m)(if(=(gcd m d)d)(+(p d(/ m d))1)0))(p(argmax(λ(d)(p d n))(range 2 n))n))
Попробуйте онлайн!
Как это работает
Альтернативная версия, которая не импортирует, factorize
а делает все с нуля, более или менее. Функция (p m d)
находит наибольшую степень d
деления, m
а затем мы просто находим наибольшее значение (p n d)
для d
между 2
и n
. (Нам не нужно ограничивать это простыми числами, поскольку не будет составной силы, которая работает лучше, чем простые силы.)