鱼C论坛

 找回密码
 立即注册
查看: 4930|回复: 49

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

[复制链接]
发表于 2018-9-2 10:54:27 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2018-9-8 19:05 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
本题又是求素数(质数)的题目,这回采用筛法来计算。关于筛法的原理,这里引用了百度百科的一段话:
用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。

看看大家谁的程序更简单,更快捷。
为了简便就求出200以内的素数。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-9-2 11:04:24 | 显示全部楼层
本帖最后由 凌九霄 于 2018-9-4 01:29 编辑

本代码中,最耗时的是sorted排序,占整个运行时间的54%左右。
  1. import timeit

  2. P  = '''
  3. nums = [ x for x in range(2, 10000) ]
  4. for i in range(len(nums)):
  5.     if i < len(nums):
  6.         nums = sorted(list(set(nums) - set([ nums[ i ] * x for x in range(2, nums[-1]//nums[i] + 1) ])))
  7.     else:
  8.         print(nums)
  9.         break
  10. '''
  11. print('运行时间:',timeit.timeit(stmt=P,number=1))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-2 11:08:42 | 显示全部楼层
  1. def fun205(n):
  2.     r=[]
  3.     f=list(range(2,n+1))
  4.     while f:
  5.         r.append(f.pop(0))
  6.         f=[x  for x in f if x%r[-1]]
  7.     return r
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-2 11:21:56 | 显示全部楼层
本帖最后由 拉了盏灯 于 2018-9-2 12:16 编辑

我这个还是有点慢,参考大神的程序,
  1. def p(n):
  2.     l = [i for i in range(2,n+1) if i==2 or i%2!=0]
  3.     for i in range(3,n,2):
  4.         if i in l:
  5.             for i in (i for i in range(2*i,n,i) if i in l):
  6.                 l.remove(i)
  7.     return l
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-2 11:55:18 | 显示全部楼层
  1. a = []
  2. for i in range(100):
  3.     a.append(i)

  4. for i in range(2,51):
  5.     if a[i]:
  6.         j = i + i
  7.         while j < 100:
  8.             a[j] = 0
  9.             j+=i
  10. for i in range(2,100):
  11.     if a[i]:
  12.         print(a[i],end = " ")
复制代码
1.png

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-2 12:20:07 | 显示全部楼层
本帖最后由 靳泽宇 于 2018-9-2 12:22 编辑

for x in range(1, 200):
    for i in range(2, x):  # ------------------从2开始一直除到它自身的前一个数
        if x % i == 0:  # ---------------------如果有余数为零,跳出循环
            break
    else:  # ----------------------------------全部除完没有余数为零的话,输出这个数字
        if x != 1:
            print(x)

点评

不是用的筛法  发表于 2018-9-8 19:12
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-2 15:33:53 | 显示全部楼层
  1. def odd_number():
  2.     num = 1
  3.     while True:
  4.         num = num + 2
  5.         yield num
  6. def screen(num):
  7.     return lambda x: x % num > 0
  8. def fun205():
  9.         yield 2
  10.         temp = odd_number()
  11.         while True:
  12.             num = next(temp)
  13.             yield num
  14.             temp = filter(screen(num),temp)

  15. numMAX = int(input('输入最大范围:'))
  16. for each in fun205():
  17.     if each < numMAX:
  18.         print(each)
  19.     else:
  20.         break
复制代码

点评

不是用的筛法  发表于 2018-9-8 19:20
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-2 16:43:33 | 显示全部楼层
  1. def fun_205(x):
  2.     list1=list(range(2,x+1))
  3.     for i in list1:
  4.         flag=0
  5.         for j in range(2,i//2+1):
  6.             if i%j==0:
  7.                 flag=1
  8.         if flag==0:
  9.             for k in range(2,x//i+1):
  10.                 if k*i in list1:
  11.                     list1.remove(k*i)
  12.     print(' ',*list1)
  13. fun_205(200)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-2 17:43:23 | 显示全部楼层
  1. def primes(num):
  2.     it = iter(range(2, num + 1))
  3.     n = next(it)
  4.     while n <= num:
  5.         yield n
  6.         it = filter(lambda x, n=n: x % n, it)
  7.         n = next(it)

  8. print(', '.join(map(str, primes(200))))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-2 17:52:39 | 显示全部楼层
  1. import time
  2. def isPrime(num):
  3.     if num<2:
  4.         return False
  5.     else:
  6.         for i in range(2,num//2+1):
  7.             if num % i==0:
  8.                 return False
  9.         else:
  10.             return True
  11. def fun205(num):
  12.     index=0
  13.     while index<len(num):
  14.         if isPrime(num[index]):
  15.             for i in num[index+1:]:
  16.                 if i%num[index]==0:
  17.                     num.remove(i)
  18.         else:
  19.             num.remove(num[index])
  20.         index+=1
  21.     print(num)

  22. t1=time.time()
  23. nums=[]
  24. for i in range(2,201):
  25.     nums.append(i)

  26. fun205(nums)
  27. print('耗时:',time.time()-t1)
复制代码

点评

筛法就不用再判断是否为质数了  发表于 2018-9-8 19:27
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-2 20:09:10 | 显示全部楼层
  1. >>> def fun( n = 200 ):
  2.         ns = list(range(n+1))
  3.         ns[0:2] = [0,0]
  4.         for i in range(n):
  5.                 if not ns[i]:
  6.                         continue
  7.                 ns[i+i::i] = [0] * len(ns[i+i::i])
  8.         return [x for x in ns if x]

  9. >>> fun()
  10. [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]
  11. >>>
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-2 20:18:35 | 显示全部楼层
本帖最后由 JessiFly 于 2018-9-2 20:19 编辑
  1. def fun205(n):
  2.     primefilter = [x for x in range(2,n+1)]
  3.     primes = []
  4.     while primefilter:
  5.         min_p = primefilter.pop(0)
  6.         primes.append(min_p)
  7.         i = min_p
  8.         while i <= (n//min_p):
  9.             mul_p = min_p * i
  10.             if mul_p in primefilter:
  11.                 primefilter.remove(mul_p)
  12.             i += 1
  13.     for each in primes:
  14.         print(each,end=' ')

  15. if __name__ == '__main__':
  16.     fun205(200)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-2 21:41:04 | 显示全部楼层
  1. import math

  2. def q205(num):
  3.     temp = list(range(2, num+1))
  4.     temp_bool = [True] * len(temp)
  5.     for i in range(2, int(math.sqrt(num)) + 1):
  6.         for j in range(2, num // i+1):
  7.             if temp_bool[temp.index(i*j)] != False:
  8.                 temp_bool[temp.index(i*j)] = False
  9.     return [temp[i] for i in range(len(temp_bool)) if temp_bool[i]]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-2 23:12:41 | 显示全部楼层
本帖最后由 天圆突破 于 2018-9-2 23:19 编辑
  1. def func205(n):
  2.     collection, result = list(range(2, n+1)), []
  3.     while collection:
  4.         result.append(collection[0])
  5.         collection = list(filter(lambda x:x%result[-1], collection[1:]))
  6.     return result
  7.    
  8. if __name__ == '__main__':
  9.     print(func205(400))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-3 14:16:26 | 显示全部楼层
  1. x = [i for i in range(2,200)]
  2. for i in x[:]:
  3.     for y in range(2,200):
  4.         z = i * y
  5.         try:
  6.             x.remove(z)
  7.         except ValueError:
  8.             pass
  9. print(x)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-3 15:53:29 | 显示全部楼层
本帖最后由 chongchuigu 于 2018-9-3 15:55 编辑
  1. def a205(n):
  2.     list1=[]
  3.     for i in range(2,n+1):
  4.         list1.append(i)
  5.     list2=list1[:]
  6.     for i in list1[0:n//2+1]:
  7.         j=2
  8.         if i not in list2:
  9.             continue
  10.         else:
  11.             s=i*j
  12.             while s<=n:               
  13.                 if s in list2:
  14.                     list2.remove(s)
  15.                 j+=1
  16.                 s=i*j
  17.     return list2
  18. print(a205(2000))
  19.             
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-3 16:10:26 | 显示全部楼层
啊啊啊啊啊啊啊啊啊啊a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-3 17:20:57 | 显示全部楼层
  1. def getNumber(x):
  2.     list0 = list((i for i in range(2, x+1)))
  3.     for i in list0[:]:
  4.         for j in list0[:]:
  5.             if j <= i:
  6.                 continue
  7.             if j % i == 0:
  8.                 list0.remove(j)
  9.     return list0
  10. print(getNumber(30))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-3 18:10:21 | 显示全部楼层
尝试了 5 个版本,没问题
200 测不出时间
  1. import time

  2. n = 2000

  3. ## code 1
  4. start_time = time.time()

  5. prime = []
  6. check = []
  7. k = int(n**0.5)
  8. for i in range(3,n+1,2):
  9.     if i not in check:
  10.         prime.append(i)
  11.         check.append(i)
  12.         if i <= k:
  13.             while check[-1] < n:
  14.                 check.append(check[-1]+i+i)
  15. if n > 1:
  16.     prime.insert(0,2)
  17. elapsed_time1 = ( time.time() - start_time )*1000



  18. ## code 2
  19. start_time = time.time()

  20. prime2 = [i for i in range(3, n+1, 2)]
  21. if n > 1:
  22.     prime2.insert(0,2)
  23. k = int(n**0.5)
  24. for i in range(3,k+1,2):
  25.     j = i
  26.     while j < n - i:
  27.         j += i+i
  28.         try:
  29.             prime2.remove(j)
  30.         except:
  31.             pass
  32.         
  33. elapsed_time2 = ( time.time() - start_time )*1000


  34. ## code 3
  35. start_time = time.time()
  36. prime3 = []
  37. check2 = []
  38. k = int(n**0.5)
  39. for i in range(3,n+1,2):
  40.     if i not in check2:
  41.         prime3.append(i)
  42.         if i <= k:
  43.             for j in range(i, n, i+i):
  44.                 if j not in check2:
  45.                     check2.append(j)
  46. if n > 1:
  47.     prime3.insert(0,2)
  48. elapsed_time3 = ( time.time() - start_time )*1000

  49. ## code 4
  50. start_time = time.time()

  51. prime4 = [i for i in range(11, n+1, 2) if i%3!=0 and i%5!=0 and i%7!=0]
  52. if n > 6:
  53.     prime4.insert(0,7)
  54. if n > 4:
  55.     prime4.insert(0,5)
  56. if n > 2:
  57.     prime4.insert(0,3)
  58. if n > 1:
  59.     prime4.insert(0,2)

  60. for i in range(11,int(n**0.5)+1,2):
  61.     j = i
  62.     while j < n - i:
  63.         j += i+i
  64.         if j in prime4:
  65.             prime4.remove(j)

  66. elapsed_time4 = ( time.time() - start_time )*1000

  67. ## code 5
  68. start_time = time.time()

  69. prime5 = [i for i in range(11, n+1, 2) if i%3!=0 and i%5!=0 and i%7!=0]
  70. if n > 6:
  71.     prime5.insert(0,7)
  72. if n > 4:
  73.     prime5.insert(0,5)
  74. if n > 2:
  75.     prime5.insert(0,3)
  76. if n > 1:
  77.     prime5.insert(0,2)

  78. for i in range(11,int(n**0.5)+1,2):
  79.     j = i*i
  80.     while j < n:
  81.         if j in prime5:
  82.             prime5.remove(j)
  83.         j += i+i

  84. elapsed_time5 = ( time.time() - start_time )*1000

  85. print('len1',len(prime),len(check))
  86. print('elapsed time = {} ms'.format(elapsed_time1))

  87. print('len2',len(prime2))
  88. print('elapsed time = {} ms'.format(elapsed_time2))

  89. print('len3',len(prime3),len(check2))
  90. print('elapsed time = {} ms'.format(elapsed_time3))

  91. print('len4',len(prime4))
  92. print('elapsed time = {} ms'.format(elapsed_time4))

  93. print('len5',len(prime5))
  94. print('elapsed time = {} ms'.format(elapsed_time5))
复制代码

n = 2000
  1. len1 303 1441
  2. elapsed time = 22.9947566986084 ms
  3. len2 303
  4. elapsed time = 17.994403839111328 ms
  5. len3 303 710
  6. elapsed time = 40.98987579345703 ms
  7. len4 303
  8. elapsed time = 7.997751235961914 ms
  9. len5 303
  10. elapsed time = 4.9991607666015625 ms
复制代码

n = 200
  1. len1 46 129
  2. elapsed time = 1.0006427764892578 ms
  3. len2 46
  4. elapsed time = 0.0 ms
  5. len3 46 59
  6. elapsed time = 0.0 ms
  7. len4 46
  8. elapsed time = 0.0 ms
  9. len5 46
  10. elapsed time = 0.0 ms
复制代码
  1. >>> prime5
  2. [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]
复制代码

应该没犯规吧?
筛选生成、筛选结果

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-9-3 19:20:52 | 显示全部楼层
代码:
  1. # 生成1`200的数,直接生成,采用列表的形式
  2. number = []
  3. prime = []
  4. for i in range(1,201):
  5.     number.append(i)

  6. # 排序
  7. number.sort()

  8. # 筛选

  9. for each in range(199):
  10.     if number[each] == 1:
  11.         number.pop(each)

  12. while number:
  13.     prime.append(number[0])
  14.     for each in number:
  15.         if each % number[0] ==0:
  16.             number.remove(each)
  17. # 输出结果
  18. print(prime)
复制代码

结果:
[2, 3, 4, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 16:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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