鱼C论坛

 找回密码
 立即注册
楼主: 冬雪雪冬

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

[复制链接]
发表于 2018-9-3 20:36:25 | 显示全部楼层
  1. prime =[]
  2. num = list(range(2,201))
  3. while num:
  4.     prime.append(num[0])
  5.     num = list(filter( lambda i:  i % num[0] ,num))

  6. print(prime)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-9-3 22:06:37 | 显示全部楼层
  1. num_list = []
  2. for i in range(1, 201):
  3.     if i == 1:
  4.         continue
  5.     else:
  6.         num_list.append(i)
  7. answer = []
  8. n = 0
  9. while n < len(num_list):
  10.     for each_num in num_list:
  11.         if each_num % num_list[n] == 0:
  12.             if each_num == num_list[n]:
  13.                 continue
  14.             else:
  15.                 num_list.remove(each_num)
  16.     n += 1

  17. print(num_list)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-3 22:14:30 | 显示全部楼层
def prime_num(n):
    result=[]
    list1=list(range(2,n+1))  
    while list1:
        i=0
        m=len(list1)
        prime=list1[0]#列表list1中的第一个元素一定是素数
        result.append(list1[0])
        while i<m:
            if list1[i]%prime==0:               
                list1.remove(list1[i])
            else:
                i+=1
            m=len(list1)      
    return result

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-4 09:10:41 | 显示全部楼层
def getprimearray(n):   
        m=int((n-1)/2)
        a=[0 for i in range(0,m+1)]
        lmt=int((n**0.5)/2)
        for i in range(1,lmt+1):
                if a[i]==0:
                        for j in range(i*3+1,m+1,i*2+1):
                                a[j]=1
        b=[2*i+1 for i in range(1,m+1) if a[i]==0]
        b.insert(0,2)
        return b


n=200
print(getprimearray(n))

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-4 09:20:59 | 显示全部楼层
  1. list1 = list(range(2,201))
  2. for i in list1:
  3.     max = 200 // i
  4.     j = 2
  5.     while j <=max:
  6.         if i*j in list1:
  7.             list1.remove(i*j)
  8.         j += 1
  9.         
  10. print(list1)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-4 10:21:52 | 显示全部楼层
  1. def func205(n):
  2.     list=[i for i in range(1,n+1)]
  3.     list.remove(1)

  4.     while len(list)!=1:
  5.         print(list[0],end=" ")
  6.         a=list[0]
  7.         for i in range(1,(n+1)//a+1):
  8.             try:
  9.                 list.remove(a*i)
  10.             except ValueError:
  11.                 pass
  12.             
  13.     print(list[0])

  14. func205(200)  
复制代码

结果: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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-4 11:33:20 | 显示全部楼层
  1. n = 200
  2. n2 = n // 2
  3. result = []
  4. lists = list(range(2,n))
  5. while True:
  6.     i = lists[0]
  7.     if i > n2:
  8.         break
  9.     result.append(i)
  10.     lists = list(filter(lambda n : n % i != 0, lists))

  11. result += lists
  12. print(result)
  13. assert result==[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]
  14. print('ok')
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-4 14:19:57 | 显示全部楼层
  1. lst = list(range(2,200))
  2. tar = []
  3. while True:
  4.     t = lst.pop(0)
  5.     tar.append(t)
  6.     for n in range(2,200):
  7.         if t*n < 200 and t*n in lst:
  8.             lst.remove(t*n)
  9.     if lst == []:
  10.         break
  11. tar
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 16:12:51 | 显示全部楼层
  1. def fun205(n):
  2.     list1, result = list(range(2, n+1)), []
  3.     while list1:
  4.         result.append(list1[0])
  5.         for each in list1:
  6.             if not each % result[-1]:
  7.                 list1.remove(each)
  8.     return result

  9.    
  10. print(fun205(200))
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 22:36:19 | 显示全部楼层
  1. import math

  2. def is_prime(num):
  3.         if num <= 1:
  4.              return False
  5.         elif num == 2:
  6.              return  True
  7.         for index in  range(2,num):
  8.                   if divmod(num,index)[1] == 0:
  9.                         return False
  10.                   else:
  11.                         return  True

  12. numlist = []
  13. num = 200
  14. while num > 1:
  15.     if is_prime(num):
  16.         numlist.append(num)
  17.     num -= 1
  18. print([x for x in reversed(numlist)])
复制代码

点评

不是用的筛法  发表于 2018-9-8 19:43
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 23:41:25 | 显示全部楼层
  1. import math
  2. def isPrime(n):
  3.     for i in range(2, int(math.sqrt(n))):
  4.         if n % i == 0:
  5.             return False
  6.     else:
  7.             return True


  8. numlist = []
  9. for i in range(0,200):
  10.        if i >= 2 and isPrime(i) :
  11.                 numlist.append(i)

  12. print(numlist)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-6 08:14:17 | 显示全部楼层
  1. list_a = []
  2. for i in range(1,201,1):
  3.     list_a.append(i)

  4. list_a.remove(1)
  5. list_b = list_a
  6. for j in list_a:
  7.     for k in range(2,200//j+2):
  8.         if j*k in list_b:
  9.             list_b.remove(j*k)

  10. print(list_b)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 17:29:02 | 显示全部楼层
  1. list1=[i for i in range(201)]
  2. list2=[]

  3. if 1 in list1:
  4.     list1.remove(1)
  5. if 0 in list1:
  6.     list1.remove(0)

  7. while list1:
  8.     list2.append(list1.pop(0))
  9.     list1 = list(filter(lambda x:x%list2[-1], list1))

  10. print(list2)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-8 14:40:04 | 显示全部楼层
本帖最后由 yanchang135 于 2018-9-8 15:42 编辑

l=[2]
for i in range(3,200):
    flag=True
    for j in l:
        if i % j == 0:
            flag = False
            break
    if flag:
        l.append(i)

print(l)
print(len(l))

点评

不是用的筛法  发表于 2018-9-8 19:44
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-11 06:44:03 | 显示全部楼层
list2=[]
list3 = list(range(1,201))
list3.sort()
list3.remove(1)
#print(list3)
while len(list3)>0:
    y=list3.pop(0)
    list2.append(y)
    for x in list3:
        if x%y==0:
            list3.remove(x)
print(list2)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-11 15:35:33 | 显示全部楼层
下面是自己写的代码,效率好低,来学习大神的代码。
  1. import time

  2. rg = 2000
  3. tt = time.time()
  4. nums = [i for i in range(2, rg)]
  5. m = 0
  6. while m < len(nums):
  7.     for k in range(2, int(nums[-1]/nums[m])+1):
  8.         if (nums[m] * k) in nums:
  9.             nums.remove(nums[m] * k)
  10.     m += 1

  11. print(nums)
  12. print(time.time() - tt)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-16 21:05:29 | 显示全部楼层
本帖最后由 喜欢吃菠菜 于 2018-10-16 21:07 编辑

递归求法:
def primeNum(numlist):
    if not numlist:
        return numlist
    return [numlist[0]]+primeNum([x for x in numlist[1:] if x%numlist[0]])

print(primeNum(range(2,100)))


结果:
[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]

不知道对不对,请大家指教
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-16 22:02:04 | 显示全部楼层
凌九霄 发表于 2018-9-2 11:04
本代码中,最耗时的是sorted排序,占整个运行时间的54%左右。

不应该去sorted,太浪费时间,而且很不pythonic.
这样的题目我建议用递归,代码简单清晰。
def primeNum(numlist):
    if not numlist:
        return numlist
    return [numlist[0]]+primeNum([x for x in numlist[1:] if x%numlist[0]])
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-17 09:38:56 | 显示全部楼层
本帖最后由 凌九霄 于 2018-10-17 09:47 编辑
喜欢吃菠菜 发表于 2018-10-16 22:02
不应该去sorted,太浪费时间,而且很不pythonic.
这样的题目我建议用递归,代码简单清晰。
def primeNum ...


首先这个方式确实简洁,效率大概是我那个的2倍多点。我相信,随着范围的增大,速度的优势也会更大。缺点是如果数的范围比较大,比如100000,递归会挂掉,重新设置了足够的允许递归层数也不行。测试了下,我的I7、8G内存,递归30000就不行了,也许内存不够。如果说我那个太浪费时间的话,递归则是太浪费空间了。有没有既快又省的方法呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-17 09:51:09 | 显示全部楼层
凌九霄 发表于 2018-10-17 09:38
首先这个方式确实简洁,效率大概是我那个的2倍多点。我相信,随着范围的增大,速度的优势也会更大。缺 ...

是的。python语言本来就是要牺牲效率而使代码优雅简洁。如果要解决大的数据肯定用python很不科学,这个必须承认。我这个只是匆忙中写的,没有优化。希望只是和大家交流一下。多指教了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-22 13:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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