2018.03.04
auther:wills
捕魚,有abcde五個人去捕魚,補了很多魚fish,休息一夜,a最先醒來,扔了一條魚然後平均分成五份,拿走了自己的一份。b第二個醒來,也扔了一條魚然後平均分成五份,拿走了自己的一份。c第三個醒來,d第四個醒來,e第五個醒來均進行了相同的動作,問:最少有多少條魚?
先從正向捕魚說起
下面是我最初寫的代碼
fish = 1
while True
flag = 1
for _ in range(5):
if (fish - 1)%5==0:
fish = (fish - 1)//5*4
else:
flag = 0
break
if flag:
print(fish)
break
fish += 1
這段代碼我已運行就進入死循環,找了半天都沒找到問題點,最後才發現我從fish=1開始,進入if語句後fish被修改爲0,然後又fish+=1,進入了死循環。修改後代碼如下
fish = 1
while 1:
flag = 1
total = fish
for _ in range(5):
if (total - 1)%5==0:
total = (total -1)//5*4
else:
flag = 0
if flag:
print(fish)
break
fish += 1
逆向思維,假設第五個人分魚後剩下的魚爲fish,這樣分魚過程就只有4次,可以少一個循環代碼如下
for fish in range(1,10000):
for n in range(4):
if (fish -1 )%5 == 0 and fish%4 == 0:
fish = fish//4*5+1
if n ==3:
print(fish)
# else:
# break
這個分魚方法有個好處,就是代碼極少,只有6行,#號註釋的兩行只是用於跳出for循環提高代碼執行速度
下面這個while+for循環的辦法可以更高的提高代碼執行速度,不過稍微需要多加幾個變量
fish = 1
flag = 1
while flag:
total = fish
for n in range(4):
if (total-1)%5==0 and total%4==0:
total = total//4*5+1
if n==3:
print(fish)
print(total)
flag =0
fish += 1
下面我把4種捕魚代碼都放到一起,並且使用了一個time函數來進行計時,比較幾種代碼的運行效率
from time import time
a1 = time()
fish = 1
while 1:
flag = 1
total = fish
for _ in range(5):
if (total - 1)%5==0:
total = (total -1)//5*4
else:
flag = 0
if flag:
print(fish)
break
fish += 1
a2 = time()
for fish in range(1,10000):
for n in range(4):
if (fish -1 )%5 == 0 and fish%4 == 0:
fish = fish//4*5+1
if n ==3:
print(fish)
a3 = time()
for fish in range(1,10000):
for n in range(4):
if (fish -1 )%5 == 0 and fish%4 == 0:
fish = fish//4*5+1
if n ==3:
print(fish)
else:
break
a4 = time()
fish = 1
flag = 1
while flag:
total = fish
for n in range(4):
if (total-1)%5==0 and total%4==0:
total = total//4*5+1
if n==3:
print(fish)
print(total)
flag =0
fish += 1
a5 = time()
print(a2-a1)
print(a3-a2)
print(a4-a3)
print(a5-a4)