鱼C论坛

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

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

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

# 排序
number.sort()

# 筛选

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

while number:
    prime.append(number[0])
    for each in number:
        if each % number[0] ==0:
            number.remove(each)
# 输出结果
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
回复 支持 反对

使用道具 举报

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

print(prime)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-3 22:06:37 | 显示全部楼层
num_list = []
for i in range(1, 201):
    if i == 1:
        continue
    else:
        num_list.append(i)
answer = []
n = 0
while n < len(num_list):
    for each_num in num_list:
        if each_num % num_list[n] == 0:
            if each_num == num_list[n]:
                continue
            else:
                num_list.remove(each_num)
    n += 1

print(num_list)

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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

查看全部评分

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

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

    while len(list)!=1:
        print(list[0],end=" ")
        a=list[0]
        for i in range(1,(n+1)//a+1):
            try:
                list.remove(a*i)
            except ValueError:
                pass
            
    print(list[0])

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

查看全部评分

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

使用道具 举报

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

result += lists
print(result)
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]
print('ok')

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-4 14:19:57 | 显示全部楼层
lst = list(range(2,200))
tar = []
while True:
    t = lst.pop(0)
    tar.append(t)
    for n in range(2,200):
        if t*n < 200 and t*n in lst:
            lst.remove(t*n)
    if lst == []:
        break
tar

评分

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

查看全部评分

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

使用道具 举报

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

    
print(fun205(200))

评分

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

查看全部评分

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

使用道具 举报

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

def is_prime(num):
        if num <= 1:
             return False
        elif num == 2:
             return  True
        for index in  range(2,num):
                  if divmod(num,index)[1] == 0:
                        return False
                  else:
                        return  True

numlist = []
num = 200
while num > 1:
    if is_prime(num):
        numlist.append(num)
    num -= 1
print([x for x in reversed(numlist)])

点评

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

使用道具 举报

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


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

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

使用道具 举报

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

list_a.remove(1)
list_b = list_a
for j in list_a:
    for k in range(2,200//j+2):
        if j*k in list_b:
            list_b.remove(j*k)

print(list_b)

评分

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

查看全部评分

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

使用道具 举报

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

if 1 in list1:
    list1.remove(1)
if 0 in list1:
    list1.remove(0)

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

print(list2)

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

print(nums)
print(time.time() - tt)
想知道小甲鱼最近在做啥?请访问 -> 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]

不知道对不对,请大家指教
想知道小甲鱼最近在做啥?请访问 -> 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]])
想知道小甲鱼最近在做啥?请访问 -> 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就不行了,也许内存不够。如果说我那个太浪费时间的话,递归则是太浪费空间了。有没有既快又省的方法呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 07:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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