Python 密碼本和電子鑰匙

二分查找

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章