前言:
考试题目大同小异,练习真题是通过考试的捷径,思路仅供参考,如果有更好的思路,欢迎一起交流学习,创作不易,文章若对你有帮助,点个关注,谢谢
题目描述
100个人围成一圈,每个人有一个编码,编号从1开始到100。
他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人数小于M。
请问最后剩余的人在原先的编号为多少?
输入描述
输入一个整数参数 M
输出描述
如果输入参数M小于等于1或者大于等于100,输出“ERROR!”;
否则按照原先的编号从小到大的顺序,以英文逗号分割输出编号字符串
用例
输入 3
输出 58,91
说明 输入M为3,最后剩下两个人。
输入 4
输出 34,45,97
说明 输入M为4,最后剩下三个人。
分析:使用list(range(1,101))构造一个1到100的列表,循环列表报数等于M时,
进行列表切割,将M前面的放到列表最后,构造一个圈的效果;递归调用,不断判断报数到M的下标,直到列表的长度小于M
直接上代码:
M = int(input())
if 1< M <100:
lis = list(range(1,101))
def func(lis):
for i in range(1,len(lis)+1):
if i == M:
#报数等于M时,进行列表切割,将M前面的放到列表最后,构造一个圈的效果
lis =lis[M:]+lis[0:M-1]
#递归调用,不断判断报数到M的下标,直到列表的长度小于M
return func(lis)
#返回lis
return lis
res = func(lis)
#按照原先的编号从小到大的顺序输出
res.sort()
print(','.join(str(j) for j in res))
else:
print('ERROR!')
运行结果: