Python:每日一题 14
本帖最后由 新手·ing 于 2017-3-31 19:36 编辑题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
程序分析:无。
如果你认真答题,会得到鱼币奖励!!!
如果你认真答题,会得到鱼币奖励!!!
如果你认真答题,会得到鱼币奖励!!!
欢迎小伙伴们,一起答题!
如果你有能力,欢迎加入我们!
已经上车老司机:@ooxx7788 @lumber2388779
{:10_298:} 点我上车 {:10_298:}
**** Hidden Message ***** @lumber2388779 @ooxx7788 @jerryxjr1220 @冬雪雪冬
来吧(刚才不小心删了...我错了...) 重新发了。
num = int(input('多少人围成一圈:'))
list1 = list(range(1, num + 1))
n = 2
while len(list1) > 1:
list1.pop(n)
n = (n + 2) % len(list1)
print('最后留下的是原来第%d号'%list1) def get_num(n):
if n == 1:
print (1)
else:
dic = {}
for i in range(1,n+1):
dic = i
for n in range(1,len(dic)-1):
for x in dic:
if dic>=3:
dic = dic -3
elif dic == 0:
dic = dic
else:
dic = dic+(len(dic)-2-n)
for a in dic:
if dic ==2:
print (a)
if __name__ == '__main__':
get_num(1000)
我也写了一个函数,测试了一下有1000个人的时候是第604
跟楼上2位的结果一样 冬雪雪冬 发表于 2017-3-31 22:04
重新发了。
你这个有点6了,很简约
我分析了半天也才写出来一个比你这长2倍的 gopythoner 发表于 2017-3-31 23:14
你这个有点6了,很简约
我分析了半天也才写出来一个比你这长2倍的
又仔细看了我自己的程序,发现一个BUG,当num=2时列表下标越界。修改过的:
num = int(input('多少人围成一圈:'))
list1 = list(range(1, num + 1))
n = 2 % len(list1)
while len(list1) > 1:
list1.pop(n)
n = (n + 2) % len(list1)
print('最后留下的是原来第%d号'%list1) 约瑟夫环问题,貌似在我的小练习中已经写过了
http://bbs.fishc.com/thread-81150-1-1.html 换一种思路:
研究一下,人数从1到20,最后留下的是
1 1
2 2
3 2
4 1
5 4
6 1
7 4
8 7
9 1
10 4
11 7
12 10
13 13
14 2
15 5
16 8
17 11
18 14
19 17
20 20
发现如下规律,下一行为前面的+3,如果超过人数的值则减去人数。
写了1-20人的程序,为了方便,把列表的第0个给值为0
num = 1
list1 =
for num in range(2, 21):
list1.append((list1 + 2) % num + 1)
for i, j in enumerate(list1):
print(i, j) 冬雪雪冬 发表于 2017-3-31 23:21
又仔细看了我自己的程序,发现一个BUG,当num=2时列表下标越界。修改过的:
支持{:10_254:} 冬雪雪冬 发表于 2017-4-1 08:52
换一种思路:
研究一下,人数从1到20,最后留下的是
{:10_282:}学习了 #coding=cp936
count=1
#设置一个计数器用于报数
def fun(x):
global count
#Python2当函数内需要对全局变量赋值时需要先声明
if len(x)==1:
print x
#退到只剩1个人的时候就能知道答案
else:
for i in x:
if count==3:
n=x.index(i)
x='a'
count=1
#当报数到3时将该人赋值为a,并重置计数器
else:
count+=1
#没报到3就下一个
for i in x:
if i=='a':
del x
#将变成3的人统统消灭
fun(x)
#数组已经改变了,重新调用一次函数
n=input('请输入人数:')
array=range(1,n+1)
fun(array)
n = int(input('请输入n的值:'))
arr = list(range(1,n+1,1))
i = 1
m = 0
while len(arr)>1:
#print('m',m,'i',i)
if i == 3 and m < len(arr):
arr.pop(m)
i = 1
continue
elif m > len(arr)-1:
m = 0
continue
m += 1
i += 1
print(arr)
跟冬雪第二种思路一样,第一种思路有点想不通 lumber2388779 发表于 2017-4-10 18:59
跟冬雪第二种思路一样,第一种思路有点想不通
不给版主奖励~谢谢支持~ 新手·ing 发表于 2017-4-10 19:08
不给版主奖励~谢谢支持~
{:10_278:}没事我是迟来的,最近有点忙 lumber2388779 发表于 2017-4-10 19:12
没事我是迟来的,最近有点忙
{:10_323:}没事支持就好~ OMG···只有我递归了吗?n到了6位数开始卡了{:10_250:}
def filter_out(n):# 传入正整数n
lst = list(range(1,n+1))
start = 0
def cal(lst, mod):
"""闭包中,lst是剩余的人的列表,mod是每一圈从哪开始的信息"""
if len(lst) == 1:
print('留下的是第 %d 个' % lst)
else:
num = (len(lst) +mod)%3 # 每轮初始算上前一轮余下的,这是当前一轮余数
new_lst = list(filter(lambda x: x not in lst, lst)) # 逢3过滤
return cal(new_lst, num)
return cal(lst, start) n = int (input("Please input n:"))
temp = []
for i in range (n):
temp.append (i+1)
while n>1:
for i in range (3):
a = temp
temp.remove(a)
if i!=2:
temp.append(a)
n -= 1
print (temp) num=int(input('请输入人数'))
list1=list(range(1,num+1))
n=2
while len(list1)>1:
list1.pop(n)
n=n+2
if n>=len(list1):
n=(n-len(list1))
if n >= len(list1):
n = (n - len(list1))
print(list1) 冬雪雪冬 发表于 2017-3-31 23:21
又仔细看了我自己的程序,发现一个BUG,当num=2时列表下标越界。修改过的:
厉害了{:10_275:} L =
count = 0
while len(L)!= 1:
j = 0
length = len(L)
for i in range(length):
count+=1
if count == 3:
del L
j+=1
count = 0
if len(L) == 1:
print(L)
break