Я на самом деле решил эту проблему, не написав для нее программы.
Это логика, которую я использовал:
Запишите все простые числа меньше 20 (цель).
[2, 3, 5, 7, 11, 13, 17, 19]
Для каждого простого числа поднимите его до максимальной мощности, для которой оно меньше целевого (20).
2**4 * 3**2 * 5 * 7 * 11 * 13 * 17 * 19
Для этого программно используйте алгоритм Сита Эратосфена - http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes для перебора простых чисел. Для каждого простого числа в списке найдите максимальную мощность, до которой оно увеличивается, чтобы получить число меньше целевого (20). Вы можете найти силу, используя эту формулу: (Math.log(target)/Math.log(i)).floor
Предполагая, что вы получите массив простых чисел: nums = [2, 3, 5, 7, 11, 13, 17, 19]
Тогда вы можете легко получить ответ, используя это:
nums.map {|i| i**((Math.log(target)/Math.log(i)).floor)}.inject(:*)