Python 鞭炮题

#甲乙丙丁4人同时开始放鞭炮,甲每隔t1s放一次,乙每隔t2s放一次,丙每隔t3s放一次,丁每隔t4s放一次,每人各放n次。
#函数fun的功能是根据形参炸响,只算一次响声,第一次响声是在第0s。


题目本意:
只能放10响,又因为t=0时,为一响,所以只能乘到9
本质:寻找7,5,4,6的公倍数(炸响的为斜体表示)
甲(7倍):  *0*   7  14  21  *28*   *35*  *42*   49  56  63
乙(5倍):  *0*   5  10  15  *20*   25  *30*   35  40  45
丙(6倍):  *0*   6  *12*  18  *24*   30  *36*   42  48  54
丁(4倍):  *0*   4   8  12  16   20  24   28  32  36  


```7,5,4,6两两互相找公倍数(4个0,35,42,28,30,20,24,36,12)
即 40-12=28


def fun(t1,t2,t3,t4,n):
    maxt = t1
    if maxt< t2:
        maxt =t2
    if maxt< t3:
        maxt =t3
    if maxt< t4:
        maxt =t4
这部分从(7,5,4,6)中找出最大的t,因为就放10响,最长时间不超过7*9=63

count = 1     ## 找出最后一次第63秒,记为1次。

for t in range(1, maxt*(n-1)):   ## 遍历(1,63)里面的数字 注:因为是从1开始的
所以没有算0,则是28响,如果是(0,63)即为29响。
        if OK(t,t1,n)or OK(t,t2,n)or OK(t,t3,n)or OK(t,t4,n):  ##满足4个条件中的一个就执行下面的次数加1.最终返回count
            count+=1
return count

def OK(i,t,n):
    return (i%t==0)and(i/t<n)
这个函数表示上一步OK(t,t1,n)的条件,意思就是(1,63)中的数字满足是质数同时满足不超过自身倍数的十倍,因为最大就是(倍数)*9,即有上述if的4种条件。

def main():
    t1 =7
    t2 =5
    t3 =6
    t4 =4
    n = 10
    r =fun(t1,t2,t3,t4,n)
print("总共可以听到%d次鞭炮声\n"%r)   ##同理%d代表 r ;r又是上述的fun函数
if __name__=='__main__':
    main()

在这里插入图片描述

完整代码如下:

def OK(i,t,n):
return (i%t==0)and(i/t<n)

def fun(t1,t2,t3,t4,n):
maxt = t1
if maxt< t2:
maxt =t2
if maxt< t3:
maxt =t3
if maxt< t4:
maxt =t4
count = 1
for t in range(1, maxt*(n-1)):
if OK(t,t1,n)or OK(t,t2,n)or OK(t,t3,n)or OK(t,t4,n):
count+=1
return count

def main():
t1 =7
t2 =5
t3 =6
t4 =4
n = 10
r =fun(t1,t2,t3,t4,n)
print(“总共可以听到%d次鞭炮声\n”%r)

if __ name__==’__ main__’:
main()

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值