Mathematically lucky tickets

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值