头歌 实验八 列表

  1. 欧拉筛法求素数

任务描述
本关任务:编写一个欧拉筛法求素数的小程序。

相关知识
为了完成本关任务,你需要掌握:1.了解欧拉筛法,2.如何处理列表。

欧拉筛法
欧拉筛法其运用的原理是质数的倍数一定不是质数。因此将质数的倍数直接标记成合数,以达到筛选质数的目的。
例如,求30之内的素数,首先建立从包含2和30的数列
2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
然后 筛除所有2的倍数
2,3,5,7,9,11,13,15,17,19,21,23,25,27,29
然后 筛除所有3的倍数
2,3,5,7,11,13,17,19,23,25,29
然后 筛除所有5的倍数
2,3,5,7,11,13,17,19,23,29
……
剩余的数就是小于等于30的所有素数,即 2,3,5,7,11,13,17,19,23,29

列表的操作
列表的添加
ls.append(x)
在列表ls最后增加一个元素x
ls.remove(x)
将列表中出现的第一个元素x删除
for x in ls:
遍历列表

编程要求
根据提示,在右侧编辑器补充代码,输入n,利用欧拉筛法求小于n的所有素数。

测试说明
平台会对你编写的代码进行测试:

测试输入:100;
预期输出:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

n=eval(input())
#代码开始
def ouLaShai(upperBound):      
    # 筛选器都标记为质数                                  
    filter=[True for i in range(upperBound+1)]
    # 存储质数
    primeNumbers=[]
    # 遍历所有数字
    for num in range(2,upperBound+1):
        # 通过筛选器判断是不是质数,若是就加入数组中
        if filter[num]:
            primeNumbers.append(num)
        
        # 遍历质数数组与当前数字进行计算,将他们的乘积标记为合数
        for prime in primeNumbers:
            if num*prime>upperBound:
                break
            filter[num*prime]=False
            # 如果当前这个数字num已经是某一个质数的倍数,此次循环结束
            if num%prime==0: 
                break;
    return primeNumbers
l = ouLaShai(n)


#代码结束
print(l)
    

  1. 统计文档中诗人列表

任务描述
本关任务:编写一个程序,将文档《中学诗词》中作者的姓名加入一个列表,按作者的姓名排序。显示列表中作者的序号和姓名。
如图所示,标题行显示诗名(或词名空格词牌名)、空格、作者
注意:其他行也可能包含空格,但标题行不包含逗号、句号、感叹号在这里插入图片描述
相关知识
为了完成本关任务,你需要掌握:1.如何打开文件,2.如何遍历文件。
3.如何处理字符串 4.如何向列表中添加信息 5.如何对列表排序

打开文件
<file对象名>=open(<文件名>,<打开模式>)
打开一个文件,并创建一个file类对象
文件名在当前文件夹下,直接输入文字的名字
在其他路径下,则是包含完整路径的名字
‘r’ 只读模式,如果文件不存在,返回异常FileNotFoundError,默认值

遍历文件
for r in 文件对象:
可以对文件的每一行循环,r为读取的每一行文本

字符串的移除
str.strip(字符);
strip() 方法用于移除字符串头尾指定的字符或字符序列,默认为空格和换行符。
例如line.strip()可删除字符串首尾的空格和换行符。
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
示例如下:

str = “00000003210Runoob01230000000”
str.strip( ‘0’ )为去除首尾字符 0,即3210Runoob0123
字符串的截取
find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。
rfind() 方法是从字符串尾部开始查找字符

示例如下:

x=‘1234a5678a9b’
pos=x.rfind(‘a’)
则pos值为9
x[:pos]为字符a以前的字符串’1234a5678’
x[pos:]为字符a及以后的字符串’a9b’
列表的处理
列表lb的添加
lb.append(元素)

列表lb的排序
lb.sort()

list1=[3,2,1,5,6]
list1.sort()
list1
[1,2,3,5,6]
测试说明
平台会对你编写的代码进行测试:
显示结果如下

f1=open("sy8//中学诗词.txt","r",encoding='utf-8')
zj=[]
#代码开始
for line in f1.readlines():
    line=line.strip()
    if ' ' in line and ',' not in line and '。'not in line and line.find('!')==-1:
        index=line.rfind(' ')
        name=line[index+1:]
        if name not in zj:
            zj.append(name)

zj.sort()  
#代码结束
for i in range(1,len(zj)+1):
    print(i,zj[i-1])
f1.close()


  1. 使用列表求解约瑟夫环

任务描述
本关任务:编写一个使用列表求解约瑟夫环的问题

约瑟夫问题可以这样描述:n个人按1,2,3,… ,n编号,并顺序围坐一圈。开始按照1,2,3,… ,m 报数,凡报到 m 的出列。直到所有人出列为止。
下图模拟n为8m为4的出列顺序
在这里插入图片描述

n=eval(input("输入人数"))
k=eval(input("输入序号"))
#代码开始
x = [] 
for i in range(1,n+1):
     x.append(i)
t = 0
for j in range(1,n+1):
    t = (t+k-1)%len(x)
    item = x.pop(t)
    print(item)

#代码结束
    
        
    

  1. 两数之和

任务描述
本关任务:
对于一个不包含重复数字的有序列表
[1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 20, 21, 29, 34, 54, 65]
从键盘输入n,查找是否有两数之和等于n,若有则返回两数的下标(找到一组即可且要求其中的一个数尽量小),若所有数均不满足条件则输出“not found”。

测试说明
平台会对你编写的代码进行测试:

测试输入:21;
预期输出:
0 14

测试输入:‘24’;
预期输出:
1 14

注意:两个数之间用空格隔开

测试输入:‘6’;
预期输出:not found

lst1=[1,4,5,6,7,8,9,10,11,12,13,15,18,19,20,21,29,34,54,65]
n=eval(input("请输入n"))
#代码开始
l=len(lst1)
for i in range(l):
    first_num=lst1[i]
    other_num=n-first_num
    if other_num in lst1:
        print(f'{i} {lst1.index(other_num)}')
        break
else:
    print('not found')
#代码结束
  1. 用户数据的增加、删除、查询

任务描述
用户列表和密码列表如下所示
yhlb=[“mary”,“harry”,“mike”,“tom”,“rose”]
mmlb=[“123456”,“888888”,“999999”,“765432”,“678901”]
补充程序,实现对用户和密码列表进行增加、删除、查询。
程序显示菜单如下
请选择
1 用户增加
2 用户删除
3 用户查询
4 退出系统

当用户输入1
输入用户姓名和密码后,若用户在列表中,显示用户已存在 无法增加。
若不存在,则将用户名和密码追加到相应的列表中。并显示用户已增加。

当用户输入2
输入用户姓名后,
若用户不在列表中,显示用户不存在 不能删除。若在列表中,则将用户名和密码删除,并显示用户已删除。

当用户输入3
输入用户姓名后,
若用户不在列表中,显示用户不存在 不能查询。若在列表中,则显示密码。

当用户输入4,则退出循环

测试说明
平台会对你编写的代码进行测试:

示范1
请选择
1 用户增加
2 用户删除
3 用户查询
4 查看数据,退出系统
请输入1
请输入用户名mike
请输入密码123456
用户已经存在,无法增加
请输入1
请输入用户名mickey
请输入密码123456
用户已增加
请输入4
用户名mary 密码123456
用户名harry 密码888888
用户名mike 密码999999
用户名tom 密码765432
用户名rose 密码678901
用户名mickey密码123456

示范2
请选择
1 用户增加
2 用户删除
3 用户查询
4 查看数据,退出系统
请输入2
请输入用户名kitty
用户不存在,无法删除
请输入2
请输入用户名mary
用户已删除
请输入4
用户名harry 密码888888
用户名mike 密码999999
用户名tom 密码765432
用户名rose 密码678901

示范3
请选择
1 用户增加
2 用户删除
3 用户查询
4 查看数据,退出系统
请输入3
请输入用户名mary
密码123456
请输入3
请输入用户名kitty
用户不存在
请输入4
用户名mary 密码123456
用户名harry 密码888888
用户名mike 密码999999
用户名tom 密码765432
用户名rose 密码678901

eyhlb=["mary","harry","mike","tom","rose"]
mmlb=["123456","888888","999999","765432","678901"]
print("""请选择
1 用户增加
2 用户删除
3 用户查询
4 查看数据,退出系统""")
#代码开始
while True:
    choice = int(input("请输入"))
    if choice == 1:
        yhlb1 = input("请输入用户名")
        mmlb1 = input("请输入密码")
        if yhlb1 in eyhlb:
            print("用户已经存在 无法增加")
        else:
            eyhlb.append(yhlb1)
            mmlb.append(mmlb1)
            print("用户已增加")
    if choice ==2:
        yhlb2 = input("请输入用户名")
        mmlb2 = "678901"
        if yhlb2 in eyhlb:
            eyhlb.remove(yhlb2)
            mmlb.remove(mmlb2)
            print("用户已删除")
        else:
            print("用户不存在 无法删除")
    if choice == 3:
        yhlb3 = input("请输入用户名")
        if yhlb3 in eyhlb:
            print("密码123456")
        else:
            print("用户不存在")
    if choice == 4:
        break;
#代码结束
for i in range(0,len(eyhlb)):
    print("用户名{:6}密码{:6}".format(eyhlb[i],mmlb[i]))
  • 11
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值