抓交通肇事犯

1.問題描述

一輛卡車違反交通規則,撞人後逃跑。現場有三人目擊該事件,但都沒有記住車號,只記下了車號的一些特徵。甲說:牌照的前兩位數字是相同的:乙說:牌照的後兩位數字是相同的,但與前兩位不同:兩是數學家,他說:4位的車號剛好是一個整數的平方。請根據以上線索求出車號。

2.確定程式框架



根據流程,構建程式框架如下:

if __name__ == '__main__':
# i代表前兩位車牌號數字,j代表後兩位車牌號數字,k代表車牌號
for i in range(10):
for j in range(10): # 窮舉前兩位和後兩位車牌數字
# 判斷前兩位和後兩位數字是否相同
if i != j:
# 組成4位車牌號碼
k = 1000 * i + 100 * i + 10 * j + j
# 判斷k是否是某個數的平方,是就輸出

3.判斷車牌k是是否為某個數的平方,是就輸出

再次利用迴圈來實現,迴圈變數 temp求平方後和車牌號k比較,相等則投到車牌號,優化演算法,temp的初值應該從31開始,因為小於30的數的平方小於4位數。故該層迴圈為最內層迴圈,對每一個年牌號均作如此操作。

for temp in range(31, 100):
if temp * temp == k:
print("車牌號為:", k)

4.完整程式

根據上面的分析,完整程式如下:

if __name__ == '__main__':
# i代表前兩位車牌號數字,j代表後兩位車牌號數字,k代表車牌號
for i in range(10):
for j in range(10): # 窮舉前兩位和後兩位車牌數字
# 判斷前兩位和後兩位數字是否相同
if i != j:
# 組成4位車牌號碼
k = 1000 * i + 100 * i + 10 * j + j
# 判斷k是否是某個數的平方,是就輸出
for temp in range(31, 100):
if temp * temp == k:
print("車牌號為:", k)

5.執行結果

Pycharm執行程式,結果如下

車牌號為: 7744

6.優化演算法

針對上述程式,如果已經找到相應的車牌號,請讀者考慮迴圈是否還需要繼續呢?答案是肯定的,因為演算法在設計窮舉迴圈的時候,並沒有在找到車牌的時候就退出迴圈,而是繼續窮舉其他ij的情況。我們可以改進演算法,設定一個“標識變數”,該變數初值為0,一旦找到車牌號,則改變該標識變數的值為1,每次迴圈判斷一下標識變數的值。如果值為1,則退出所有迴圈,這樣能有效的減少迴圈次數,改進的程式如下:

if __name__=="__main__":
# i代表前兩位車牌號數字,j代表後兩位車牌號的數字,k代表車牌號
flog = 0 # 迴圈標識變數,為1時推出所有迴圈
for i in range(10):
if flog:
break
for j in range(10): # 窮舉前兩位和後兩位車牌數字
if flog:
break
# 判斷前兩位和後兩位數字是否相同
if i != j:
# 組成4位車牌號碼
k = 1000 * i + 100 * i + 10 * j + j
# 判斷k是否是某個數的平方,是就輸出
for temp in range(31, 100):
if temp * temp == k:
print("車牌號為: ", k)
flog = 1
break