一、编程题
1、要求:设计一个算法,求1~n(n为大于2的正整数)中有哪些素数,总共是多少个素数?
根据上述计算规则,补全下列代码。
函数名:getPrime(n)
参数表:n -- n为大于2的正整数。
返回值:返回素数组成的数组。
示例:当n=9时,返回:您输入的区间1-n中素数分别是:[2, 3, 5, 7],总共是4个素数!
解析:【喵呜刷题小喵解析】本题要求设计一个算法,求1~n(n为大于2的正整数)中有哪些素数,并计算素数的总数。算法思路:1. 遍历2到n之间的所有整数,判断是否为素数。2. 对于每个整数,从2开始到该整数的平方根,判断该整数是否能被整除。3. 如果不能被整除,则该整数为素数,将其加入素数数组。4. 返回素数数组。根据算法思路,补全代码如下:```pythondef getPrime(n):if n <= 2:return []primes = []for i in range(2, n+1):is_prime = Truefor j in range(2, int(i**0.5)+1):if i % j == 0:is_prime = Falsebreakif is_prime:primes.append(i)return primesn = int(input("请输入一个大于2的正整数:"))print(f"您输入的区间1-{n}中素数分别是:{getPrime(n)},总共是{len(getPrime(n))}个素数!")```代码解释:1. 首先判断n是否小于等于2,如果是,则直接返回空数组。2. 初始化一个空数组primes,用于存储素数。3. 遍历2到n之间的所有整数,判断是否为素数。4. 对于每个整数,从2开始到该整数的平方根,判断该整数是否能被整除。5. 如果不能被整除,则该整数为素数,将其加入素数数组。6. 返回素数数组。在示例中,当n=9时,程序会输出:您输入的区间1-9中素数分别是:[2, 3, 5, 7],总共是4个素数!
2、编写上交作业的程序,老师要求把小组7位同学(编号为1,2,3,...,6,7)的作业收齐,小组编号1的同学跟编号2的同学说“收作业了”,之后每位同学依次向后面的一位同学说要“收作业了”,直到最后,编号7的同学将自己的作业,上交到编号6的同学手中,编号6的同学将编号7的作业及自己的作业一起上交到编号5的同学,按这样的流程;直到编号1将其他同学的作业及自己的作业上交到老师中。要求编号7同学的作业放在最前面,即老师看到的作业是编号7的作业,然后是编号6的作业,最后是编号1的作业。
根据上述算法思想,编写自定义函数完成程序功能,完善空白处代码。
"""
函数名def getHomeWork(hw,n)
参数表:hw存储每位同学的作业信息,n表示第n位同学的作业
返回值:每位同学的作业,要求最后1位同学的作业显示在最前面,第1位同学作业显示在最后面
"""
解析:【喵呜刷题小喵解析】根据题目要求,我们需要编写一个函数,该函数接收两个参数:hw(存储每位同学的作业信息的列表)和n(表示第n位同学的作业)。函数的目标是将第n位同学的作业移到列表的最前面,同时保持列表中其他元素的相对顺序不变。首先,我们检查n是否为1。如果是,那么直接将hw列表的最后一个元素移到列表的最前面。这是因为编号1的同学的作业需要放在最后,所以我们直接将它移到列表的最前面。如果n不是1,那么我们需要递归调用getHomeWork函数,将n-1位同学的作业移到列表的最前面。这是因为在编号n的同学将作业传给编号n-1的同学之前,编号n-1的同学已经将他的作业传给了编号n-2的同学,以此类推。然后,我们将hw列表的第n-1个元素移到列表的最前面。这是因为编号n的同学将他的作业传给了编号n-1的同学,所以我们需要将编号n的作业移到列表的最前面。最后,我们返回更新后的hw列表。这样,我们就可以保证最后一位同学的作业显示在最前面,第一位同学的作业显示在最后面,同时保持列表中其他元素的相对顺序不变。
3、要求:设计一个算法,枚举排列问题。输入1-n的第1个排列,如1 2 3,按照大小输出1~n的所有排列,并统计全部排列总数。
根据上述算法思想,补全下列代码。
描述:输入1-n的第1个排列,如1 2 3,按照大小输出1~n的所有排列。
函数名:perm(n,begin,end)
参数表:n -- 整数n,begin -- 指向排列的第一个元素,end-- 指向排列的最后一个元素。
返回值:输出1-n的所有排列方式,每行一个排列,按从小到大。
示例:当输入1 2 3时,返回:
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 2, 1]
[3, 1, 2]
排列总数是:6个!
解析:【喵呜刷题小喵解析】这个问题要求枚举1到n的所有排列,并输出它们。这里我们采用递归的方法来实现。首先,我们定义一个函数perm(n, begin, end),其中n表示总共有n个数,begin和end分别表示当前排列的起始和结束位置。在perm函数中,我们首先检查begin是否等于end,如果等于,说明我们已经找到了一个排列,直接输出即可。如果不等于,我们遍历从begin到end的所有数,对于每个数i,我们递归调用perm函数,将begin加1,end保持不变,继续寻找下一个位置的数。当递归返回后,我们交换i和begin位置的数,然后输出当前的排列。注意,在输出排列之前,我们需要先将排列中的数按照升序排列,这样才能保证输出的排列是按照大小顺序的。最后,我们调用perm函数,传入n,0,n-1作为参数,开始枚举排列。在输出排列时,我们使用了' '.join(map(str, temp)),其中temp是一个列表,表示当前的排列。我们将列表中的每个数转换为字符串,然后用空格连接起来,最后输出。注意,由于题目中要求按照大小输出1~n的所有排列,所以我们在输出排列时,需要先将排列中的数按照升序排列。在Python中,交换两个数的值可以使用一个临时变量来实现,这里我们定义了一个swap函数,用于交换两个数的值。在输出排列之后,我们调用swap函数,传入需要交换的数组和交换的位置,交换后数组中的数就按照升序排列了。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!