超級網迷

超級網迷+ 電腦迷+ 音樂迷
個人資料
正文

用Python解決一道小學數學題

(2016-01-05 20:55:52) 下一個

上小學的兒子問了我這麽一道數學題:

1) 使用+,-,×,/,(,和)六個操作符;

2) 使用操作數5,5,5,5,5;

3) 要求每個操作數/操作符隻使用一次。

列出所有可能的表達式,並計算每個表達式的值。

 

【注意】要排除諸如 +-,()或55這種操作數/操作符連一起的情況;也要排除5(,)(,)5,(5)等情況。

 

【腳本】版本使用python2.7x。演示腳本如下:

【運行結果】 共找到 210 表達式:
(5+5-5*5)/5 = -3
(5+5-5/5)*5 = 45
(5+5-5)*5/5 = 5
(5+5-5)/5*5 = 5
(5+5*5-5)/5 = 5
(5+5*5/5)-5 = 5
(5+5*5)-5/5 = 29
(5+5*5)/5-5 = 1
(5+5/5-5)*5 = 5
(5+5/5*5)-5 = 5
(5+5/5)-5*5 = -19
(5+5/5)*5-5 = 25
(5+5)-5*5/5 = 5
(5+5)-5/5*5 = 5
(5+5)*5-5/5 = 49

... (省略) ...

 

看來,腳本還是可以幫著幹不少活的^_^。

在城裏 2016.01.05

 

 

 

 

[ 打印 ]
閱讀 ()評論 (1)
評論
在城裏 回複 悄悄話 感謝chirolike給出的更精煉的代碼:
import itertools
import re

BAD_LIST = ['55', '5(', ')(', ')5', '(5)']
FIRST_CHAR_LIST = ['(', '-', '5']
LAST_CHAR_LIST = [')', '5']
exp_list = []
my_list = [r for r in itertools.product(FIRST_CHAR_LIST, LAST_CHAR_LIST)]
init_lst = ['5', '5', '5', '5', '5', '+', '-', '*', '/', '(', ')']

if __name__ == '__main__':
print '======= Possible combinations for the math question ============'
for first, last in my_list:
lst = list(init_lst)
lst.remove(first)
lst.remove(last)
for exp in [first + ''.join(f) + last for f in itertools.permutations(lst)]:
if any([y in exp for y in BAD_LIST]) or
re.search(r'[-*/+][-*/+]+|^(.*)$', exp): continue
elif exp not in exp_list:
try:
print "%s = %d" % (exp, eval(exp))
exp_list.append(exp)
except: pass
print 'Total expressions found = ', len(exp_list)


鏈接在這裏: http://bbs.wenxuecity.com/computer/241769.html
登錄後才可評論.