欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

火柴棍等式

程序员文章站 2022-06-02 21:24:58
...

火柴棍等式
现在小张有n根火柴棍,希望拼出形如A+B=C的等式,等式中的A,B,C都是用火柴棍拼出来的整数,数字0-9的拼法如上图所示。
例如现在小张手上有14根火柴棍,则可以拼出两个不同的等式
0+1=1,1+0=1
注意:
1.加号和等号各需要两根火柴棍
2.如果A<>B,则A+B=C与B+A=C视为不同的等式
3.所有火柴棍必须全部用上
假设有m根火柴棍(m<=24),那么可以拼出多少个不同的形如A+B=C的等式呢?
(题目来自《啊哈!算法》)
分析:
要找出A+B=C的等式,可以枚举A,B,C的值,关键是A,B,C的范围是多少呢?
24根火柴棍,去掉+和=还有20根火柴棍,所有数字中表示1需要的火柴棍最少,2根,那么20根火柴棍,可以表示10个1,有A,B,C3个数字,那么A,B,C最大的数字不能超过1111,也就是我们枚举的范围是0–1111,A,B,C都要这个范围里枚举吗?其实A,B确定后C 也确定了,因此只要A,B枚举,然后对应每一个A,B得到C,从而计算出每个数字所需的火柴棍数,即可求出答案。
对于任意1个数字,我们怎么求出火柴棍数呢?
对于一个整数n,
取出余数r,对应到r所需要的火柴棍数

直到整数n每位数字取完。

我们可以编写一个函数fun(),代码如下:

这里写代码片
def fun(num):
    result=0 #表示某个数需要多少根火柴棍
    f=[6,2,5,5,4,5,6,3,7,6]  #每个数需要的火柴棍数
    while (num // 10 !=0):
        result+=f[num % 10]
        num=num // 10
    result+=f[num]
    return result
c=0
m=int(input("输入火柴棍数m<=24"))
for i in range(0,1111):
    for j in range(0,1111):
        k=i+j
        if fun(i)+fun(j)+fun(k)==m-4:
            print("{0}+{1}={2}".format(i,j,k))
            c+=1
print("一共有{0}".format(c))

运行结果如下:

0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11
一共有9
【扩展】
本题涉及的操作是一个取数问题,对于1个数字n,怎么取数每一个数字,常规方法是采用整除和取余数的方法实现。但是在python中可以用更简单的方法实现
假定数据 m,
s=map(int,str(m)) 一句话可以将数据m的每一个数字取出

>>> m=235
>>> s=map(int,str(m))
>>> list(s)
[2, 3, 5]

map函数的作用是将迭代对象(str(m))的每一个元素取出,并调用之前的函数(int),最后返回map对象,可以转换为list对象显示结果。

相关标签: 枚举