在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
如果我们不允许前导零,然后打印在约12秒128个可能的解决方案。
但我仍然想知道,有没有一种算法或更好的方式来解决这个非蛮力的方式?
您可以保存4倍,如果去掉其中任2 3位数或2 2位数互换组合。 如果你的计算是a * bc * d,你知道这与 - (c * da * b)相同,如果a> c和b> d这比a * dc * b大,那么你应该只考虑后者。 –