Прокрутите вниз, чтобы просмотреть последнее редактирование, я оставил весь этот текст здесь, чтобы я не сделал недействительными ответы, полученные до сих пор!
У меня есть следующий мозговой тизер, на который я хотел бы получить решение, я попытался решить это, но поскольку я не математически намного выше среднего (то есть, я думаю, что я очень близок к среднему) Я не могу обмануть голову вокруг этого.
Задача: данное число x
должно быть разделено на серию multipliers
, где каждая multiplier <= y
, y
является константой, равной 10 или 16 или что-то еще. В серии (технически array of integers
) вместо числа умножается, чтобы можно было преобразовать множители обратно в исходное число.
В качестве примера допустим x=29
и y=10
. В этом случае ожидаемый массив будет {10,2,9}
, что означает 10*2+9
. Однако если y=5
, это будет {5,5,4}
, что означает 5*5+4
, или если y=3
, это будет {3,3,3,2}
, который будет тогда 3*3*3+2
.
Я попытался решить это, выполнив что-то вроде этого:
- while
x >= y
, сохранитеy
доmultipliers
, затемx = x - y
- когда
x < y
, сохранитеx
доmultipliers
Очевидно, что это не сработало, я также попытался сохранить "оставшуюся" часть отдельно и добавить, что после всего остального, но это тоже не сработало. Я считаю, что моя главная проблема заключается в том, что я стараюсь думать об этом слишком сложно, в то время как решение явно очевидно и просто.
Повторяем, это ограничения, которые должен иметь этот алгоритм:
- должен работать с 64-битными longs
- должен возвращать массив из 32-битных целых чисел (... ну, шорты тоже в порядке)
- в то время как поддержка подписанных номеров (как +, так и) будет приятной, если она помогает заданию только неподписанных чисел - это обязательный
И пока я делаю это с использованием Java, я предпочел бы использовать любые возможные примеры кода в качестве псевдокода, я специально НЕ хочу получить готовые ответы, мне просто нужно подтолкнуть (ну, еще больше сильный удар), чтобы Я могу решить это, по крайней мере, частично. Спасибо заранее.
Изменить: Дальнейшие разъяснения
Чтобы избежать некоторой путаницы, я думаю, что я должен немного изменить это:
- Каждое целое число в массиве результатов должно быть меньше или равно y, включая последнее число.
- Да, последний номер - просто магическое число.
- Нет, это не модуль, так как тогда в большинстве случаев второе число будет больше y.
- Да, есть много ответов на большинство доступных номеров, однако я ищу тот, у кого меньше всего математического кода. Что касается моей логики, это означает найти максимальное количество как можно больших множителей, например
x=1 000 000,y=100
is100*100*100
, хотя10*10*10*10*10*10
равноправный ответ математически.
Мне нужно продумать эти ответы до сих пор с некоторыми мыслями, но если у вас есть что добавить, пожалуйста! Я действительно ценю интерес, который вы уже проявили к этому, спасибо вам всем за это.
Изменить 2: Больше объяснений + награда
Хорошо, похоже, что то, к чему я стремился, просто не может быть сделано так, как я думал, это может быть. Я был слишком двусмыслен с моей целью, и после того, как я немного подумал, я решил полностью рассказать вам, что я хотел бы сделать, и посмотреть, что вы можете придумать.
Первоначально моя цель заключалась в том, чтобы придумать конкретный метод для пакетного объединения 1..n больших целых чисел (aka longs), чтобы их строковое представление заметно короче, чем запись фактического числа. Думайте, что кратные десяти, 10 ^ 6 и 1 000 000 одинаковы, однако длина представления в символах не является.
Для этого я хотел как-то объединить числа, так как ожидается, что числа несколько близки друг к другу. Вначале я думал, что представление 100, 121, 282
как 100+21+161
может быть способом, но сохранение в строковой длине в лучшем случае является пренебрежимым и действительно не работает так хорошо, если числа не очень близки друг к другу. В основном я хотел больше, чем ~ 10%.
Итак, я придумал, что если бы я сгруппировал числа по общему свойству, например мультипликатору, и разделил остальную часть числа на отдельные компоненты, которые я могу представить в виде строки. Вот где эта проблема встает, я подумал, что, например, 1 000 000 и 100 000 могут быть выражены как 10 ^ (5 | 6), но из-за контекста моего целевого использования это было слишком чересчур:
Контекст - это Web.URL-адрес RESTful: s для конкретного. Вот почему я упомянул о том, что я думал об использовании 64 символов (безопасных буквенно-цифровых символов, а не некоторых), с тех пор я мог создавать, казалось бы, случайные URL-адреса, которые можно было распаковать в список целых чисел, выражающих набор идентификационных номеров. В этот момент я подумал о создании базовой 64-разрядной системы чисел для выражения базовых чисел 10/2, но поскольку я не являюсь математическим гением, я не знаю, как это сделать после этого.
Баунти
Теперь, когда я написал всю историю (извините, что это длинный), я открываю щедрость на этот вопрос. Все, что касается требований к предпочтительному алгоритму, указанному ранее, остается в силе. Я также хочу сказать, что я уже благодарен за все ответы, которые я получил до сих пор, мне нравится быть ошибочным, если это делается так, как вы это делали.
Заключение
Ну, теперь дается щедрость. Я распространил несколько комментариев на ответы в основном на будущие ссылки и на себя, вы также можете проверить мое SO Uservoice предложение о распространении награды, которая связана с этот вопрос, если вы думаете, что мы должны иметь возможность распространять его среди нескольких ответов.
Спасибо, что нашли время и ответили!