python之捕魚問題

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)

下面是3次運行結果

第一次

第二次

第三次

這裏寫圖片描述

可以看出第二種代碼最簡潔,但是運行速度最慢,第四種雖然有點冗長,但是運行速度是最快的。那麼衆位看官,你們會選哪一種呢。

發佈了43 篇原創文章 · 獲贊 19 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章