В science museum in Norway я наткнулся на следующую математическую игру:Разница между двумя ближайшими к нулю продуктами: без грубой силы?
Цель состоит в том, чтобы поместить 10 цифр от 0 до 9 таким образом, что разница между этими двумя продуктами является ближайшим к нулю. (246 - это самый низкий балл).
Вернувшись домой, я написал следующий код перебором:
import time
from itertools import permutations
def form_number(x, y, z, a, b):
# not explicitly stated, but presume that leading zeroes are not allowed
if x == 0 or a == 0:
return 0
return ((100 * x) + (10 * y) + z) * ((10 * a) + b)
def find_nearest_zero(*args):
assert len(args) == 10
return form_number(*args[:5]) - form_number(*args[5:])
if __name__ == '__main__':
start = time.time()
count = 0
for p in permutations(range(10), 10):
result = find_nearest_zero(*p)
if result == 0:
count += 1
print '{}{}{} * {}{} = {n}'.format(*p[:5], n=form_number(*p[:5]))
print '{}{}{} * {}{} = {n}'.format(*p[5:], n=form_number(*p[5:]))
print
print 'found {} solutions'.format(count)
print time.time() - start
Если мы не допускаем ведущие нули, то это печатает 128 возможных решений в течение примерно 12 секунд.
Но я не знаю, есть ли алгоритм или лучший способ решить эту проблему не-грубой силой?
Вы можете сохранить фактор 4, если удалить комбинации, где либо 2 3-значных чисел или 2 2-значные номера перепутаны. Если ваш расчет является * bc * d, вы знаете, что это то же самое, что и (c * da * b), и если a> c и b> d это больше, чем * dc * b, рассмотрим только последнее. –