Выражение целого числа в виде последовательности множителей - PullRequest
11 голосов
/ 25 апреля 2009

Прокрутите вниз, чтобы увидеть последние изменения, я оставил весь этот текст здесь только для того, чтобы не аннулировать ответы, полученные на данный вопрос!


У меня есть следующая головоломка, для которой я хотел бы найти решение, я пытался решить эту проблему, но математически я не намного выше среднего (, то есть я думаю, что я очень близок в среднем ) Я не могу обернуться вокруг этого.

Проблема: данное число 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.

Я пытался решить эту проблему следующим образом:

  1. , а x >= y, хранить y до multipliers, затем x = x - y
  2. при x < y, хранить x до multipliers

Очевидно, что это не сработало, я также пытался сохранить «оставшуюся» часть отдельно и добавить ее после всего остального, но это тоже не сработало. Я считаю, что моя главная проблема заключается в том, что я пытаюсь думать об этом слишком сложным образом, в то время как решение очевидно и просто.

Повторим, вот ограничения, которые должен иметь этот алгоритм:

  • должен работать с 64-битной длиной
  • должен вернуть массив 32-битных целых чисел (... ну, шорты тоже в порядке)
  • в то время как поддержка чисел со знаком (как +, так и -) была бы хороша, если бы это помогало заданию, только числа без знака являются обязательными

И хотя я делаю это с использованием Java, я предпочел бы использовать любые возможные примеры кода в качестве псевдокода, я специально НЕ хочу получать готовые ответы, мне просто нужно подтолкнуть (ну, более сильный удар), чтобы Я могу решить это, по крайней мере, частично сам. Заранее спасибо.

Редактировать: Дополнительные разъяснения

Чтобы избежать путаницы, думаю, мне следует перефразировать это немного:

  • Каждое целое число в массиве результатов должно быть меньше или равно y, включая последнее число.
  • Да, последний номер - просто магическое число.
  • Нет, это не модуль, поскольку в большинстве случаев второе число будет больше, чем y.
  • Да, есть несколько ответов на большинство доступных чисел, однако я ищу тот, у которого наименьшее количество математических операций. Что касается моей логики, это означает, что нужно найти максимальное количество как можно больших множителей, например, x=1 000 000,y=100 равно 100*100*100, хотя 10*10*10*10*10*10 одинаково правильный ответ по математике.

Мне нужно пройти через приведенные ответы с некоторой мыслью, но если у вас есть что добавить, пожалуйста, сделайте! Я высоко ценю интерес, который вы уже проявили к этому, спасибо всем за это.

Редактировать 2: дополнительные объяснения + щедрость

Ладно, похоже, то, к чему я стремился, просто не может быть сделано так, как я думал. Я был слишком двусмысленен с моей целью, и, подумав немного, я решил просто рассказать вам полностью, что я хотел бы сделать, и посмотреть, что вы можете придумать.

Первоначально моя цель состояла в том, чтобы придумать конкретный метод для упаковки больших целых чисел (больше длинных) 1..n так, чтобы их представление String было заметно короче, чем запись действительного числа. Представьте, что кратные десяти, 10 ^ 6 и 1 000 000 одинаковы, однако длина представления в символах не совпадает.

Для этого я хотел как-то объединить числа, так как ожидается, что числа несколько близки друг к другу. Сначала я подумал, что представление 100, 121, 282 как 100+21+161 может быть подходящим способом, но экономия длины строки в лучшем случае пренебрежимо мала и действительно не работает так хорошо, если числа не очень близки друг к другу. В основном я хотел больше, чем ~ 10%.

Так что мне пришла в голову мысль, что если я сгруппирую числа по общему свойству, такому как множитель, и разделю оставшуюся часть числа на отдельные компоненты, которые я затем смогу представить в виде строки. Вот где эта проблема возникает, я думал, что, например, 1 000 000 и 100 000 можно выразить как 10 ^ (5 | 6), но из-за контекста моего целевого использования это было слишком ненадежно:

Контекст - веб. RESTful URL: для конкретности. Вот почему я упоминал о том, чтобы подумать об использовании 64 символов (веб-безопасных буквенно-цифровых незарезервированных символов, а затем и некоторых) с тех пор, как я мог создать кажущиеся случайными URL-адреса, которые можно было бы распаковать в список целых чисел, выражающих набор номеров идентификаторов. В этот момент я подумал о создании базовой 64-подобной системы счисления для выражения базовых чисел 10/2, но, поскольку я не гений математики, я не знаю, как это сделать.

Щедрость

Теперь, когда я написал всю историю (извините, что она длинная), я открываю награду за этот вопрос. Все, что касается требований к предпочтительному алгоритму, указанному ранее, остается в силе. Я также хочу сказать, что я уже благодарен за все ответы, которые я получил до сих пор, мне нравится быть доказанным неправильно, если это сделано так, как вы, люди.

Заключение

Ну, щедрость теперь дается. Я выкладываю несколько комментариев к ответам, в основном для дальнейшего использования, и вы можете также проверить мое предложение SO Uservoice о распределении щедрости, которое связано с этим вопросом, если вы считаете, что мы сможем распространить его среди нескольких ответы.


Спасибо всем, что нашли время и ответили!

Ответы [ 13 ]

0 голосов
/ 25 апреля 2009

Просто установите x: = x / n, где n - это наибольшее число, которое меньше, чем x и y Когда вы заканчиваете с x <= y, это ваш последний номер в последовательности. </p>

0 голосов
/ 25 апреля 2009

Как и в моем комментарии выше, я не уверен, что точно понимаю вопрос. Но при условии целых чисел (n и заданного y), это должно работать для случаев, которые вы указали:

multipliers[0] = n / y;
multipliers[1] = y;
addedNumber = n % y;
0 голосов
/ 25 апреля 2009

Разве это не модуль?

Пусть / будет целочисленным делением (целые числа), а % будет по модулю.

int result[3];

result[0] = y;
result[1] = x / y;
result[2] = x % y;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...