修改给定的数字以找到所需的总和?

Gau*_*rav 17 c puzzle algorithm math sum

我的一个朋友给我发了这个问题.我还没有真正想出任何算法来解决这个问题.

你有一个号码.说123456789和两个运营商* and +.现在没有改变提供的序列号.并根据需要多次使用这些运算符,评估给定值:

例如:给定值2097
解决方案:1+2+345*6+7+8+9

关于如何解决这些问题的任何想法?

PP.*_*PP. 29

最简单的方法之一是在BASH中使用shell扩展:

#!/bin/sh

for i in 1{,+,*}2{,+,*}3{,+,*}4{,+,*}5{,+,*}6{,+,*}7{,+,*}8{,+,*}9; do
    if [ $(( $i )) == 2097 ]; then
        echo $i = 2097
    fi
done

这使:

$ sh -c '. ./testequation.sh'
12*34+5*6*7*8+9 = 2097
12*3*45+6*78+9 = 2097
1+2+345*6+7+8+9 = 2097

  • +1用于寻找如此惊人的紧凑(优雅)解决方案. (2认同)

Joh*_*ooy 12

没有那么多的解决方案 - 这个python程序需要一秒钟才能完成所有这些解决方案

from itertools import product

for q in product(("","+","*"), repeat=8):
    e = ''.join(i+j for i,j in zip('12345678',q))+'9'
    print e,'=',eval(e)
Run Code Online (Sandbox Code Playgroud)

这是一个运行grep的示例

$ python sums.py | grep 2097
12*34+5*6*7*8+9 = 2097
12*3*45+6*78+9 = 2097
1+2+345*6+7+8+9 = 2097
Run Code Online (Sandbox Code Playgroud)

一般解决方案是简单的修改

from itertools import product

def f(seq):
    for q in product(("","+","*"), repeat=len(seq)-1):
        e = ''.join(i+j for i,j in zip(seq[:-1],q))+seq[-1]
        print e,'=',eval(e)
Run Code Online (Sandbox Code Playgroud)