Веселая пара эквивалентностей равна 1 + 5 = 2 · 3 и 1 · 5 = 2 + 3 . Есть много подобных, другой 1 + 1 + 8 = 1 · 2 · 5 и 1 · 1 · 8 = 1 + 2 + 5 . В общем случае произведение n натуральных чисел равно сумме n натуральных чисел, и наоборот.
В этой задаче вы должны сгенерировать все такие комбинации натуральных чисел для входа n> 1 , исключая перестановки. Вы можете вывести их в любом разумном формате. Например, все возможные решения для n = 3 :
(2, 2, 2) (1, 1, 6)
(1, 2, 3) (1, 2, 3)
(1, 3, 3) (1, 1, 7)
(1, 2, 5) (1, 1, 8)
Программа, которая может генерировать наибольшее число комбинаций для наибольшего n за одну минуту на моей 2 ГБ оперативной памяти , выигрывает 64-разрядный ноутбук Intel Ubuntu. Если ваш ответ использует более 2 ГБ ОЗУ или написан на языке, который я не могу протестировать с помощью свободно доступного программного обеспечения, я не буду оценивать ваш ответ. Через две недели я проверю ответы и выберу победителя. Более поздние неконкурентные ответы все еще могут быть размещены, конечно.
Поскольку неизвестно, каковы полные наборы решений для всех n , вам разрешено публиковать ответы, которые генерируют неполные решения. Однако, если другой ответ генерирует (более) полное решение, даже если их максимум n меньше , этот ответ выигрывает.
Чтобы уточнить, вот процесс подсчета очков, чтобы определить победителя:
Я протестирую вашу программу с n = 2, n = 3 и т. Д. Я сохраню все ваши выводы и остановлюсь, когда ваша программа займет больше минуты или более 2 ГБ ОЗУ. Каждый раз, когда программа запускается для заданного ввода n, она будет остановлена, если это займет более 1 минуты.
Я смотрю на все результаты для всех программ для n = 2. Если одна программа дала меньше правильных решений, чем другая, эта программа исключается.
Повторите шаг 2 для n = 3, n = 4 и т. Д. Выигрывает последняя стоящая программа.
источник
Ответы:
C (gcc) , n = 50000000 с 6499 результатами за 59 с
Чтобы избежать получения терабайта выходных данных, состоящих почти полностью из 1 с, последовательность (скажем) 49999995 1 с сокращается как
1x49999995
.Попробуйте онлайн!
источник
Mathematica, n = 293 с 12 решениями
ОП изменил задачу и запросил ввод.
Вот новый код, который принимает любое n в качестве ввода.
Для n = 293 вы получаете 12 решений.
вход
Вы можете протестировать этот алгоритм на Wolfram Sandbox, который является свободно доступной онлайн- программой.
Просто перейдите по ссылке, вставьте код (Ctrl + V), вставьте ввод в конце кода. и нажмите Shift + Enter для запуска.
Вы получите все мои решения в считанные секунды
Вот и попробуй онлайн!в C ++ (gcc)
(большое спасибо @ThePirateBay за поддержку и перевод моего кода на свободный язык)
эта программа генерирует только решения вида {a, b, c} {a, b, c},
что означает a + b + c = a * b * c
Требуется 1 секунда для вычисления
Двенадцать решений:
источник
Python 2 , n = 175, 28 результатов в 59 с
Сделал это немного медленнее, используя коэффициент уменьшения 2, но получил больше решений, начиная с n = 83
Я получаю результаты до 92 на TIO за один прогон.
Попробуйте онлайн!
источник
Рубин , n = 12 получает 6 решений
По крайней мере, на TIO, обычные результаты от 1 до 11
Попробуйте онлайн!
Получает 10 результатов в минуту при n = 13 на моем ноутбуке.
источник
Mathematica, n = 19 с 11 решениями
это мой новый ответ в соответствии с новыми критериями ОП
если вы дадите ввод [n] в конце, программа отобразит решения
вот мои результаты (на моем старом ноутбуке 64-битной 2,4 ГГц)
источник
Haskell, много решений быстро
f
вычисляет решения,main
функция добавляет получение ввода из командной строки и некоторое форматирование и подсчет.источник
ghc -O3 -o prodsum prodsum.hs
и запустите с аргументом командной строки:./prodsum 6
Haskell , n = 10 с 2 решениями
Это работает как дерьмо, но я, по крайней мере, исправил это, так что я сейчас решаю проблему!
Попробуйте онлайн!
источник
Аксиома, n = 83 за 59 секунд здесь
полученные результаты:
Способ запуска вышеупомянутого текста в Axiom: скопировать весь этот текст в файл, сохранить файл с именем: Name.input, в окне Axiom использовать ") read absolutepath / Name".
Результаты: (# f (i) находит длину массива f (i), то есть количество решений)
источник