0
点赞
收藏
分享

微信扫一扫

Mathematically lucky tickets

ixiaoyang8 2022-02-27 阅读 91
python

同学的一道题,这一看就该上暴力枚举啊!
思忖良久后,上网搜了一下大佬的解法,比自己想的妙多了,于是大体上参照着那份做了点注释。(但总感觉在切片上还可以更优),目前没什么更好的思路,先记下
请添加图片描述虽然题目洋洋洒洒,但实际上就是:将一个六位数切割成几个整数,整数间可以加减乘除组合,如果有一种组合的值为100,则该六位数不lucky,输出False

from itertools import product 
#product(list1,list2)就是依次从list1,list2中各取一个元素,俩元素组成一个tuple元祖,再将所有元祖组合成一个列表返回


def ck(input_number): #检查可能的组合结果里有没有100
    def p_r(input_number): #计算可能的结果
        #yield类似return,就是返回一个值,并且记住这个返回的位置,下次迭代从这个位置开始
        yield int(input_number)
        for i in range(1,len(input_number)):
            #切片,题目里说了不可以改变输入字符串的顺序
            for (x,y) in product(p_r(input_number[:i]),p_r(input_number[i:])):
                
                yield from (x+y,x-y,x*y)  
                if y !=0:  #检查一下y是否为0,因为如果分母为0 程序会崩
                    yield x/y
    return True if 100 not in p_r(input_number) else False


if __name__ =='__main__':
    a='y'
    while a=='y': #这里只是为了方便测试
        ticket_number=input("请输入ticket number:") #python3默认input的是string
        if (len(ticket_number)==6):   #检查输入数字是否是6位,题目里说明了是6位
            print(ck(ticket_number))  #输出结果
        else:
            print("输入错误")
        a=input("是否继续输入,y or n:") 
举报

相关推荐

0 条评论