Python使用超高效算法查找所有类似123-45-67+89=100的组合

本文介绍一种高效算法,可在瞬间找出所有通过在123456789间插入+或-符号使表达式等于100的组合。采用三进制加法原理,避免了传统暴力破解的耗时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创 2018-02-28 董付国,胡凤国 Python小屋

问题描述:在123456789这9个数字中间插入任意多个+和-的组合,使得表达式的值为100,输出所有符合条件的表达式。

昨天发了一个暴力测试的方法来解决问题,详见Python查找所有类似于123-45-67+89 = 100的组合,但是暴力测试的方法非常慢,大概需要运行3个小时多。今天分享一个超高效的算法及其实现,可以瞬间输出所有结果,感谢中国传媒大学胡凤国老师提供这个神奇的算法。

主要思路:设计一个三进制加法算法,让8个0逐步变化到8个3,其中每一位上的数字可以是0、1、2,然后让0对应空格、1对应+、2对应-,然后在1到9之间的8个位置上分别插入空格、+或-符号,最后删掉表达式中的空格并求值,如果等于100则满足条件。

参考代码:

'''[0,0,0,0,0,0,0,0]->[0,0,0,0,0,0,0,1]->...[2,2,2,2,2,2,2,2]'''
def triAdd(operators):
    lastPosition = len(operators)-1
    c = 1
    for i in range(lastPosition,-1,-1):
        c , operators[i] = divmod(operators[i]+c,3)  #进行求3模,得到c为商,operators[i]为余数
        if c ==0:            #保证triAdd函数从右至左,每次只对末位元素进行+1。
            return None
    return 1
def main(digits='123456789',total=100):
    d = ' +-'
    operators = [0]*(len(digits)-1)
    while not triAdd(operators): 
        operator = map(lambda o:d[o],operators)
        exp = ''.join((o+c for o,c in zip(digits,operator)))+digits[-1] #1-8后面分别按照o+c进行组合
        exp = ''.join(exp.split())
        if eval(exp) == total:
            print(exp)
main()

结果如下:

123+45-67+8-9
123+4-5+67-89
123-45-67+89
123-4-5-6-7+8-9
12+3+4+5-6-7+89
12+3-4+5+67+8+9
12-3-4+5-6+7+89
1+23-4+56+7+8+9
1+23-4+5+6+78-9
1+2+34-5+67-8+9
1+2+3-4+5+6+78+9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值