免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yingweixu
打印 上一主题 下一主题

Python 练习题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2013-10-28 14:49 |只看该作者
没看到后几页,原来已经写完了 ,囧啊

论坛徽章:
0
32 [报告]
发表于 2014-04-04 09:54 |只看该作者
def findlastpeople():
    total=range(1,101)
    i=2
    while len(total)>1:
        total=total[1:101:2]
    a=total[0]
    print(a)
findlastpeople()
   

论坛徽章:
0
33 [报告]
发表于 2014-04-09 13:40 来自手机 |只看该作者
大家貌似都是比较依赖各种函数~说一个简单一点的~更依赖于算法~2的n次方<100,而2的n次方就是剩下的最后一个人,100以内是第64个人,也就是2的6次方~

论坛徽章:
0
34 [报告]
发表于 2014-04-09 14:43 |只看该作者
回复 33# 我要吃西瓜

你这个答案是最牛的,真正的数学,我用程序测试了一下,一万以内是正确的。如果可能你能给出证明吗?你又是怎么想到的呢?谢谢,学习了。
   

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
35 [报告]
发表于 2014-04-10 09:05 |只看该作者
因为:第一个开始枪毙,每枪毙一个跳过一个(相当于对2求余,余数为1则干掉)
所以,当总人数<2^(n+1), n=1时结果显然成立。

假设当 n = k 时结果成立,此时,不妨设: 总人数为 T = 2 ^ (k+1) - 1
则,当n=k+1时,
在所有 2 ^ (k+1) < T < 2 ^ (k + 2)的数中,
只有 2^(K+1) 对包含2的因子数>2^k,
所以,当2^k这位被干掉时,2^(k+1)这位还活着,
又:在范围2 ^ (k+1) < T < 2 ^ (k + 2)中,没有其它的数字比2^(K+1)的2的因子数多,
所以,最后剩下来的是 2^(k+1)这位。

联合上面两个,可以得出,在给定数的范围内中,2^n的值最大的人会活下来。
(PS:考虑到 Python 下标是 0 开始的,代码的结果索引应当是 2^n-1)

论坛徽章:
0
36 [报告]
发表于 2014-04-10 17:45 |只看该作者
本帖最后由 yaozhibing41001 于 2014-04-10 17:46 编辑

回复 1# yingweixu
  1. #! /usr/bin/python
  2. list=range(1,101)
  3. while  len(list)>1:
  4.     for x  in  list[0::2]:
  5.             list.remove(x)
  6. print list
复制代码

论坛徽章:
0
37 [报告]
发表于 2014-04-10 22:20 |只看该作者
>>> def a(l=range(1,101)):
        ll=[]
        for i in range(1,len(l),2):
                ll.append(l[i])
        if len(l)==1:
                return l
        return a(ll)

>>> a()
[64]

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
38 [报告]
发表于 2014-04-14 22:00 |只看该作者
本帖最后由 cao627 于 2014-04-14 22:39 编辑

回复 34# Hadron74

123456789......   源数据
*2*4*6*8*......   第一轮
***4***8*......   第二轮


可见 :
第1轮后剩下的数之间隔开1个*,剩下的最小的数之前有1个*
第2轮后剩下的数之间隔开3个*,剩下的最小的数之前有3个*  
第3轮后剩下的数之间隔开7个*,剩下的最小的数之前有7个*
可概括为第n轮后剩下的数之间隔开2^n-1个*,剩下的最小的数之前有2^n-1*
于是第6轮后剩下的数之间隔开63个*,剩下的最小的数之前有63个*
63个*,然后是一个数64,然后再是63个*。127之内(当然更是100之内了)就剩下唯一的数64了


可见对于数列 [range(1,x)]   x为一整数>1
经过n轮“枪杀”过后,侥幸剩下的数的最小数之前有2^n-1个*,如果2^n-1已经大于x的一半,那么数列中就只能剩下数2^n了。
  1. >>> [2**i for i in range(1,101) if  101 > 2**i > 50 ]
复制代码
这样或更有效率: 用了网上查到的方法:用i & i-1 == 0 判断一个数是否为2的n次方,原理为2的整数次方(0次方除外)i的2进制结构中必然只有一位为1,与i-1进行&与运算必然为0
  1. >>> [i for i in range(50,101) if  i & i-1 == 0 ]
复制代码

论坛徽章:
0
39 [报告]
发表于 2014-04-15 10:39 |只看该作者
这个是list的基操作测试,很多人把问题复杂化了,其实很简单就可以搞定了。
  1. people = [i for i in range(100)]

  2. while len(people) > 1 :
  3.     people = people[1::2]

  4. print people
复制代码

论坛徽章:
0
40 [报告]
发表于 2014-04-15 13:08 |只看该作者
本帖最后由 Hadron74 于 2014-04-15 13:30 编辑

回复 38# cao627


你的结果很有意思.兴趣所致,我稍改一下题目,看看是什么样子?

练习题:有N个人,分别从1一直到N, 站成一个圈。现在有人拿枪从第一个开始枪毙,每枪毙一个跳过一个,转圈完成。请问最后活着的是这N人里的第几个人?看谁写的简单。

我先试着写了一个:
  1. for N in range(1,101):
  2.     c = list(range(1,N+1))
  3.     while len(c) > 1:
  4.         c.pop(0)
  5.         b = c.pop(0)
  6.         c.append(b)
  7.     print c
复制代码
结果很有意思:

  1. [1]
  2. [2]
  3. [2]
  4. [4]
  5. [2]
  6. [4]
  7. [6]
  8. [8]
  9. [2]
  10. [4]
  11. [6]
  12. [8]
  13. [10]
  14. [12]
  15. [14]
  16. [16]
  17. [2]
  18. [4]
  19. [6]
  20. [8]
  21. [10]
  22. [12]
  23. [14]
  24. [16]
  25. [18]
  26. [20]
  27. [22]
  28. [24]
  29. [26]
  30. [28]
  31. [30]
  32. [32]
  33. [2]
  34. [4]
  35. [6]
  36. [8]
  37. [10]
  38. [12]
  39. [14]
  40. [16]
  41. [18]
  42. [20]
  43. [22]
  44. [24]
  45. [26]
  46. [28]
  47. [30]
  48. [32]
  49. [34]
  50. [36]
  51. [38]
  52. [40]
  53. [42]
  54. [44]
  55. [46]
  56. [48]
  57. [50]
  58. [52]
  59. [54]
  60. [56]
  61. [58]
  62. [60]
  63. [62]
  64. [64]
  65. [2]
  66. [4]
  67. [6]
  68. [8]
  69. [10]
  70. [12]
  71. [14]
  72. [16]
  73. [18]
  74. [20]
  75. [22]
  76. [24]
  77. [26]
  78. [28]
  79. [30]
  80. [32]
  81. [34]
  82. [36]
  83. [38]
  84. [40]
  85. [42]
  86. [44]
  87. [46]
  88. [48]
  89. [50]
  90. [52]
  91. [54]
  92. [56]
  93. [58]
  94. [60]
  95. [62]
  96. [64]
  97. [66]
  98. [68]
  99. [70]
  100. [72]
复制代码
有兴趣的朋友证明一个,呵呵;抛砖引玉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP