鱼C论坛

 找回密码
 立即注册
查看: 7128|回复: 59

[技术交流] Python:每日一题 14

[复制链接]
发表于 2017-3-31 19:34:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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


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

  1. [hide]if __name__ == '__main__':
  2.     nmax = 50
  3.     n = int(input('请输入总人数:'))
  4.     num = []
  5.     for i in range(n):
  6.         num.append(i + 1)

  7.     i = 0
  8.     k = 0
  9.     m = 0

  10.     while m < n - 1:
  11.         if num[i] != 0 : k += 1
  12.         if k == 3:
  13.             num[i] = 0
  14.             k = 0
  15.             m += 1
  16.         i += 1
  17.         if i == n : i = 0

  18.     i = 0
  19.     while num[i] == 0: i += 1
  20.     print(num[i])
  21. [/hide]
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
gopythoner + 1 + 1 你这个系列还挺不错的,我已经订阅了,准备.

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-31 19:36:43 | 显示全部楼层
@lumber2388779 @ooxx7788 @jerryxjr1220 @冬雪雪冬
来吧(刚才不小心删了...我错了...)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-31 22:04:48 | 显示全部楼层
重新发了。
  1. num = int(input('多少人围成一圈:'))
  2. list1 = list(range(1, num + 1))
  3. n = 2
  4. while len(list1) > 1:
  5.     list1.pop(n)
  6.     n = (n + 2) % len(list1)
  7. print('最后留下的是原来第%d号'%list1[0])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-3-31 23:13:33 | 显示全部楼层
  1. def get_num(n):
  2.     if n == 1:
  3.         print (1)
  4.     else:
  5.         dic = {}
  6.         for i in range(1,n+1):
  7.             dic[i] = i
  8.         for n in range(1,len(dic)-1):
  9.             for x in dic:
  10.                 if dic[x]>=3:
  11.                     dic[x] = dic[x] -3
  12.                 elif dic[x] == 0:
  13.                     dic[x] = dic[x]
  14.                 else:
  15.                     dic[x] = dic[x]+(len(dic)-2-n)
  16.         for a in dic:
  17.             if dic[a] ==2:
  18.                 print (a)

  19. if __name__ == '__main__':
  20.     get_num(1000)
复制代码


我也写了一个函数,测试了一下有1000个人的时候是第604
跟楼上2位的结果一样

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
新手·ing + 1 + 1 一回来就一直给你发鱼币...

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-31 23:14:49 | 显示全部楼层

你这个有点6了,很简约
我分析了半天也才写出来一个比你这长2倍的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-31 23:21:31 | 显示全部楼层
gopythoner 发表于 2017-3-31 23:14
你这个有点6了,很简约
我分析了半天也才写出来一个比你这长2倍的

又仔细看了我自己的程序,发现一个BUG,当num=2时列表下标越界。修改过的:
  1. num = int(input('多少人围成一圈:'))
  2. list1 = list(range(1, num + 1))
  3. n = 2 % len(list1)
  4. while len(list1) > 1:
  5.     list1.pop(n)
  6.     n = (n + 2) % len(list1)
  7. print('最后留下的是原来第%d号'%list1[0])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-1 00:27:06 | 显示全部楼层
约瑟夫环问题,貌似在我的小练习中已经写过了
http://bbs.fishc.com/thread-81150-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-1 08:52:31 | 显示全部楼层
换一种思路:
研究一下,人数从1到20,最后留下的是
  1. 1 1
  2. 2 2
  3. 3 2
  4. 4 1
  5. 5 4
  6. 6 1
  7. 7 4
  8. 8 7
  9. 9 1
  10. 10 4
  11. 11 7
  12. 12 10
  13. 13 13
  14. 14 2
  15. 15 5
  16. 16 8
  17. 17 11
  18. 18 14
  19. 19 17
  20. 20 20
复制代码

发现如下规律,下一行为前面的+3,如果超过人数的值则减去人数。
写了1-20人的程序,为了方便,把列表的第0个给值为0
  1. num = 1
  2. list1 = [0, 1]
  3. for num in range(2, 21):
  4.     list1.append((list1[num -1] + 2) % num + 1)
  5. for i, j in enumerate(list1):
  6.     print(i, j)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-1 18:01:29 | 显示全部楼层
冬雪雪冬 发表于 2017-3-31 23:21
又仔细看了我自己的程序,发现一个BUG,当num=2时列表下标越界。修改过的:

支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-1 18:01:56 | 显示全部楼层
冬雪雪冬 发表于 2017-4-1 08:52
换一种思路:
研究一下,人数从1到20,最后留下的是

学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-3 12:58:01 | 显示全部楼层
  1. #coding=cp936
  2. count=1
  3. #设置一个计数器用于报数
  4. def fun(x):
  5.         global count
  6.         #Python2当函数内需要对全局变量赋值时需要先声明
  7.         if len(x)==1:
  8.                 print x
  9.         #退到只剩1个人的时候就能知道答案
  10.         else:
  11.                 for i in x:
  12.                         if count==3:
  13.                                 n=x.index(i)
  14.                                 x[n]='a'
  15.                                 count=1
  16.                         #当报数到3时将该人赋值为a,并重置计数器
  17.                         else:
  18.                                 count+=1
  19.                         #没报到3就下一个
  20.                 for i in x:
  21.                         if i=='a':
  22.                                 del x[x.index(i)]
  23.                         #将变成3的人统统消灭
  24.                 fun(x)
  25.                         #数组已经改变了,重新调用一次函数
  26. n=input('请输入人数:')
  27. array=range(1,n+1)
  28. fun(array)        
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
新手·ing + 4 + 4 思路很清晰,支持!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

发表于 2017-4-10 18:59:25 | 显示全部楼层
  1. n = int(input('请输入n的值:'))
  2. arr = list(range(1,n+1,1))
  3. i = 1
  4. m = 0
  5. while len(arr)>1:
  6.     #print('m',m,'i',i)
  7.     if i == 3 and m < len(arr):
  8.         arr.pop(m)
  9.         i = 1
  10.         continue
  11.     elif m > len(arr)-1:
  12.         m = 0
  13.         continue
  14.     m += 1
  15.     i += 1
  16. print(arr)
复制代码


跟冬雪第二种思路一样,第一种思路有点想不通
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 19:08:27 | 显示全部楼层
lumber2388779 发表于 2017-4-10 18:59
跟冬雪第二种思路一样,第一种思路有点想不通

不给版主奖励~谢谢支持~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 19:12:02 | 显示全部楼层
新手·ing 发表于 2017-4-10 19:08
不给版主奖励~谢谢支持~

没事我是迟来的,最近有点忙
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 19:24:48 | 显示全部楼层
lumber2388779 发表于 2017-4-10 19:12
没事我是迟来的,最近有点忙

没事支持就好~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-30 20:56:51 | 显示全部楼层
OMG···只有我递归了吗?n到了6位数开始卡了
  1. def filter_out(n):  # 传入正整数n
  2.     lst = list(range(1,n+1))
  3.     start = 0
  4.     def cal(lst, mod):
  5.         """闭包中,lst是剩余的人的列表,mod是每一圈从哪开始的信息"""
  6.         if len(lst) == 1:
  7.             print('留下的是第 %d 个' % lst[0])
  8.         else:
  9.             num = (len(lst) +mod)%3   # 每轮初始算上前一轮余下的,这是当前一轮余数
  10.             new_lst = list(filter(lambda x: x not in lst[2-mod::3], lst)) # 逢3过滤
  11.             return cal(new_lst, num)
  12.     return cal(lst, start)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-1 22:00:16 | 显示全部楼层
  1. n = int (input("Please input n:"))
  2. temp = []
  3. for i in range (n):
  4.     temp.append (i+1)
  5. while n>1:
  6.     for i in range (3):
  7.         a = temp[0]
  8.         temp.remove(a)
  9.         if i!=2:
  10.             temp.append(a)
  11.     n -= 1
  12. print (temp[0])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-1 14:59:35 | 显示全部楼层
  1. num=int(input('请输入人数'))
  2. list1=list(range(1,num+1))
  3. n=2
  4. while len(list1)>1:
  5.   list1.pop(n)
  6.   n=n+2
  7.   if n>=len(list1):

  8.     n=(n-len(list1))
  9.     if n >= len(list1):
  10.         n = (n - len(list1))

  11. print(list1)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 21:48:34 | 显示全部楼层
冬雪雪冬 发表于 2017-3-31 23:21
又仔细看了我自己的程序,发现一个BUG,当num=2时列表下标越界。修改过的:

厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-15 10:37:02 | 显示全部楼层
L = [int(x+1) for x in range(int(input('输入一个数字:')))]
count = 0
while len(L)!= 1:
    j = 0
    length = len(L)
    for i in range(length):
        count+=1
        if count == 3:
            del L[i-j]
            j+=1
            count = 0
        if len(L) == 1:
            print(L)
            break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 03:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表