Python 密码本和电子钥匙

发布时间 2023-10-17 23:24:56作者: emanlee

二分查找

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)