新手·ing 发表于 2017-3-31 19:34:47

Python:每日一题 14

本帖最后由 新手·ing 于 2017-3-31 19:36 编辑

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
程序分析:无。

如果你认真答题,会得到鱼币奖励!!!
                      如果你认真答题,会得到鱼币奖励!!!
                                              如果你认真答题,会得到鱼币奖励!!!

欢迎小伙伴们,一起答题!
如果你有能力,欢迎加入我们!
已经上车老司机:@ooxx7788 @lumber2388779   
{:10_298:} 点我上车 {:10_298:}

**** Hidden Message *****

新手·ing 发表于 2017-3-31 19:36:43

@lumber2388779 @ooxx7788 @jerryxjr1220 @冬雪雪冬
来吧(刚才不小心删了...我错了...)

冬雪雪冬 发表于 2017-3-31 22:04:48

重新发了。
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)

gopythoner 发表于 2017-3-31 23:13:33

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位的结果一样

gopythoner 发表于 2017-3-31 23:14:49

冬雪雪冬 发表于 2017-3-31 22:04
重新发了。

你这个有点6了,很简约
我分析了半天也才写出来一个比你这长2倍的

冬雪雪冬 发表于 2017-3-31 23:21:31

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)

jerryxjr1220 发表于 2017-4-1 00:27:06

约瑟夫环问题,貌似在我的小练习中已经写过了
http://bbs.fishc.com/thread-81150-1-1.html

冬雪雪冬 发表于 2017-4-1 08:52:31

换一种思路:
研究一下,人数从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)

新手·ing 发表于 2017-4-1 18:01:29

冬雪雪冬 发表于 2017-3-31 23:21
又仔细看了我自己的程序,发现一个BUG,当num=2时列表下标越界。修改过的:

支持{:10_254:}

新手·ing 发表于 2017-4-1 18:01:56

冬雪雪冬 发表于 2017-4-1 08:52
换一种思路:
研究一下,人数从1到20,最后留下的是



{:10_282:}学习了

18813034116 发表于 2017-4-3 12:58:01

#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)      

lumber2388779 发表于 2017-4-10 18:59:25

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)

跟冬雪第二种思路一样,第一种思路有点想不通

新手·ing 发表于 2017-4-10 19:08:27

lumber2388779 发表于 2017-4-10 18:59
跟冬雪第二种思路一样,第一种思路有点想不通

不给版主奖励~谢谢支持~

lumber2388779 发表于 2017-4-10 19:12:02

新手·ing 发表于 2017-4-10 19:08
不给版主奖励~谢谢支持~

{:10_278:}没事我是迟来的,最近有点忙

新手·ing 发表于 2017-4-10 19:24:48

lumber2388779 发表于 2017-4-10 19:12
没事我是迟来的,最近有点忙

{:10_323:}没事支持就好~

solomonxian 发表于 2017-4-30 20:56:51

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)

NwkerWang 发表于 2017-6-1 22:00:16

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)

Bekkkkkahhh 发表于 2017-8-1 14:59:35

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-8-22 21:48:34

冬雪雪冬 发表于 2017-3-31 23:21
又仔细看了我自己的程序,发现一个BUG,当num=2时列表下标越界。修改过的:

厉害了{:10_275:}

张大象 发表于 2017-9-15 10:37:02

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
页: [1] 2 3
查看完整版本: Python:每日一题 14