#甲乙丙丁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()