《程序员的算法趣题》-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言。有兴趣的同学,可以购书阅读~
在此更新个人编写的Python版,仅供学习使用。(运行环境:Python3.6)
Q13 有多少种满足字母算式的解法
所谓字母算式,就是用字母表示的算式,规则是相同字母对应相同数字,不同字母对应不同数字,并且第一位字母的对应数字不能是 0。
譬如给定算式 We×love = CodeIQ,则可以对应填上下面这些数字以使之成立。
W = 7, e = 4, l = 3, o = 8, v = 0, C = 2, d = 1, I = 9, Q = 6
这样一来,我们就能得到 74×3804 = 281496 这样的等式。使前面那个字母算式成立的解法只有这一种。问题
求使下面这个字母算式成立的解法有多少种?
READ + WRITE + TALK = SKILL
import re
def calc(calc_string):
re_res = re.search('[A-Z]', calc_string)
if re_res is None:
if eval(calc_string):
result_equation_list.append(calc_string.replace("==", '='))
return
else:
_character = re_res.group()
for value in char_dict[_character]:
if value not in calc_string:
replaced_string = calc_string.replace(_character, value)
calc(replaced_string)
char_equation = 'READ+WRITE+TALK==SKILL'
cal_number = re.findall('[A-Z]+', char_equation)
char_dict = {}
changed_equation = char_equation
for word in cal_number:
for index, character in enumerate(word):
if index == 0:
char_dict[character] = [str(i) for i in range(1, 10)]
elif character not in char_dict:
char_dict[character] = [str(i) for i in range(10)]
result_equation_list = []
calc(char_equation)
print("结果共有%s种,分别是:\n%s" % (len(result_equation_list), '\n'.join(result_equation_list)))
运行结果:
结果共有10种,分别是:
1632+41976+7380=50988
2543+72065+6491=81099
4905+24689+8017=37611
5094+75310+1962=82366
5096+35710+1982=42788
5180+65921+2843=73944
5270+85132+3764=94166
7092+37510+1986=46588
7092+47310+1986=56388
9728+19467+6205=35400