二分查找
a=[1,3,5,7,9] # 序列 k=3 # 目標 l=0 # 開頭(注意,是索引號) r=4 # 結尾(注意,是索引號) while l+1!=r: # 是否只剩一個 mid=int((l+r)//2) # 中間(注意,是索引號) if a[mid]<k: # 小於目標 l=mid # 結尾移到中間位置上(往大走) elif a[mid]>k: # 大於目標 r=mid # 開頭移到中間位置上(往小走) if a[mid]==k: # 命中目標 print(a[mid],'的位置是',mid)
密碼問題:
根據密碼本和電子鑰匙,破解筆記本電腦的密碼。
密碼本是一個非降的整數序列,電子鑰匙是一個整數,得到密碼的方法是在密碼本中找到最接近電子鑰匙的整數(如果多個符合條件,輸出最小的一個)。
例如:
密碼本爲下面的列表
a=[1,22,43,45,45,55,60,70,89]
電子鑰匙爲整數44
滿足條件的整數爲43和45,最終的密碼爲43
a=[1,22,43,45,45,55,60,70,89] # 密碼本(序列) k=int(input()) # 電子鑰匙(目標) l=0 # 開頭(注意,是索引號) r=8 # 結尾(注意,是索引號) while l+1!=r: # 看是否只剩一個 mid=int((l+r)//2) # 中間(注意,是索引號) if a[mid]<k: # 小於目標 l=mid # 往大走 elif a[mid]>k: # 大於目標 r=mid # 往小走 if a[mid]==k: # 等於目標 break # 停 if k-a[l]<=a[r]-k: # 看兩個目標距離誰大誰小,如果左邊的小,或者,兩邊相同距離 print(a[l]) # 打出左邊的 else: # 否則 print(a[r]) # 打出右邊的
羅馬數字問題:
羅馬數字包含以下七種字符: I, V, X, L,C,D 和 M。
27寫做 XXVII,即爲 XX + V + II 。通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 IIII而是 IV。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減去數 1 得到的數值 4。同樣地,數字 9 表示爲 IX。
這個特殊的規則只適用於以下六種情況:
I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。
現編寫輸入一個羅馬數字,輸出其整數結果,請編程實現上述功能,或補全代碼。
例如,當輸入XXII時,輸出22;當輸入MCMXC時,輸出1990.
rmdict = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000} rm = list(input("請輸入正確的羅馬數字:")) num, prew = 0, 1 for ch in rm[::-1]: w = rmdict[ch] if prew > w: num = num - w else : num = num + w prew = w print(num)