谢谢各位大神
reduce(lambda i,n: i if 0 in [n%x for x in i] else i+[n] , xrange(2,100), [])
15 个解决方案
#1
F = lambda i, n: i if 0 in [n % x for x in i] else i + [n]
R = []
for i in range(2, 100):
R = F(R, i)
print R
def Fi(i, n):
res = [n % x for x in i]
if 0 in res:
return i
else:
return i + [n]
R = []
for i in range(2, 100):
R = Fi(R, i)
print R
#2
谢谢,很强大!
另外,想知道这个算法还能不能再优化呢,就是减少判断次数,类似从n/2到sqrt(n)
#3
def F(l, n):
for x in l:
if n % x == 0:
return
l.append(n)
def P(l, n):
from math import sqrt
m = sqrt(n)
for x in l:
if (x <= m) and (n % x == 0):
return
l.append(n)
R = []
for i in range(2, 100):
P(R, i)
print R
不知道F和P,谁更快?
#4
def P(l, n):
from math import sqrt
m = sqrt(n)
for x in l:
if x <= m:
if n % x == 0:
return
else:
break
l.append(n)
R = []
for i in range(2, 1000000):
P(R, i)
print R
#5
太牛了,这个效率很高呀
#6
算法就基本是#4这样了
但程序还可以微调再优化
例如
在2之后n为偶数就没必要扔进def了
每位的数字和是3的倍数,该数也是3的倍数,例如27:2+7=9
在5后个位为5/0也是
还有其他一些排除规律
……
也可以完全用上述排除法得出质数列的,记得好像叫试除法?忘了
import也应该挪出函数外,虽然py只有第一次调用import,但后面每次def内都要检查一次的,降低效率
但程序还可以微调再优化
例如
在2之后n为偶数就没必要扔进def了
每位的数字和是3的倍数,该数也是3的倍数,例如27:2+7=9
在5后个位为5/0也是
还有其他一些排除规律
……
也可以完全用上述排除法得出质数列的,记得好像叫试除法?忘了
import也应该挪出函数外,虽然py只有第一次调用import,但后面每次def内都要检查一次的,降低效率
#7
其实没有必要import math的,
算sqrt用 “num**0.5” 就行,4楼的或者写成x*x<=n也行
算sqrt用 “num**0.5” 就行,4楼的或者写成x*x<=n也行
#8
昨晚google了一下,排除法应该叫“筛除法”,不是试除法
写了一个,但水平不高,测试比#4慢一百倍,瓶颈在生成器和sort(),但也没想到优化方法
但思路是这样的,每添加一个质数,就把其倍数在原数列中排除,剩下的数列最小的一个就是质数
写了一个,但水平不高,测试比#4慢一百倍,瓶颈在生成器和sort(),但也没想到优化方法
但思路是这样的,每添加一个质数,就把其倍数在原数列中排除,剩下的数列最小的一个就是质数
q = list(range(2, 10000))
l = []
while 1:
if len(q) <= 2:
l.extend(q)
break
else:
qs = q.pop(0)
l.append(qs)
qm = q[len(q) - 1]
q1 = set(qs * n for n in range(2, int(qm / qs) + 1))
q = list(set(q) - q1)
q.sort()
print(l)
#9
from math import sqrt
from datetime import datetime, timedelta
def P(l, n):
m = sqrt(n)
for x in l:
if x > m:
break
if n % x == 0:
return
l.append(n)
def Run(F, M):
R = []
tStart = datetime.now()
for i in range(2, M):
F(R, i)
tEnd = datetime.now()
tDelta = tEnd - tStart
print tDelta
L = len(R)
print L, R[0 : L if L < 10 else 10]
M = 1000000
Run(P, M)
有没有更快一点的?
#10
你把tStart = datetime.now()放在 import 前和后比较一下
参考#7建议
参考#7建议
#11
from time import time
t0=time()
def prime(n):
return reduce(lambda x,y: [i for i in x if i%y!=0 or i==y], range(2,int(n**0.5)+1),range(2,n+1))
print len(prime(10**5))
print time()-t0
这个算是简洁和效率比较平衡的方法,比lz的快了不少,但没有@bugs2k的快
#12
n = 1000000
a = [True] * (n + 1)
b = []
for i in range(2, int(n ** 0.5) + 1):
if a[i]:
for j in range(i, int(n / i) + 1):
a[j * i] = False
for i in range(2, n + 1):
if a[i]:
b.append(i)
print(b)
结合筛除法和开方
不会array,我水平到此为止了, 写不出更好的了
#13
楼上这个不错,简单优化一下...
a = [True] * (n + 1)
b = [2]
for i in range(3, int(n ** 0.5) + 1, 2):
if a[i]:
for j in range(i*i, n + 1, i):
a[j] = False
for i in range(3, n + 1, 2):
if a[i]:
b.append(i)
#14
谢谢,步长为2意思是奇数数列么?呵呵,少一半循环……
#15
嗯,是仅处理奇数列,貌似还不够完善,内层循环再改一下for j in range(i*i, n + 1, i
*2)
#1
F = lambda i, n: i if 0 in [n % x for x in i] else i + [n]
R = []
for i in range(2, 100):
R = F(R, i)
print R
def Fi(i, n):
res = [n % x for x in i]
if 0 in res:
return i
else:
return i + [n]
R = []
for i in range(2, 100):
R = Fi(R, i)
print R
#2
谢谢,很强大!
另外,想知道这个算法还能不能再优化呢,就是减少判断次数,类似从n/2到sqrt(n)
#3
def F(l, n):
for x in l:
if n % x == 0:
return
l.append(n)
def P(l, n):
from math import sqrt
m = sqrt(n)
for x in l:
if (x <= m) and (n % x == 0):
return
l.append(n)
R = []
for i in range(2, 100):
P(R, i)
print R
不知道F和P,谁更快?
#4
def P(l, n):
from math import sqrt
m = sqrt(n)
for x in l:
if x <= m:
if n % x == 0:
return
else:
break
l.append(n)
R = []
for i in range(2, 1000000):
P(R, i)
print R
#5
太牛了,这个效率很高呀
#6
算法就基本是#4这样了
但程序还可以微调再优化
例如
在2之后n为偶数就没必要扔进def了
每位的数字和是3的倍数,该数也是3的倍数,例如27:2+7=9
在5后个位为5/0也是
还有其他一些排除规律
……
也可以完全用上述排除法得出质数列的,记得好像叫试除法?忘了
import也应该挪出函数外,虽然py只有第一次调用import,但后面每次def内都要检查一次的,降低效率
但程序还可以微调再优化
例如
在2之后n为偶数就没必要扔进def了
每位的数字和是3的倍数,该数也是3的倍数,例如27:2+7=9
在5后个位为5/0也是
还有其他一些排除规律
……
也可以完全用上述排除法得出质数列的,记得好像叫试除法?忘了
import也应该挪出函数外,虽然py只有第一次调用import,但后面每次def内都要检查一次的,降低效率
#7
其实没有必要import math的,
算sqrt用 “num**0.5” 就行,4楼的或者写成x*x<=n也行
算sqrt用 “num**0.5” 就行,4楼的或者写成x*x<=n也行
#8
昨晚google了一下,排除法应该叫“筛除法”,不是试除法
写了一个,但水平不高,测试比#4慢一百倍,瓶颈在生成器和sort(),但也没想到优化方法
但思路是这样的,每添加一个质数,就把其倍数在原数列中排除,剩下的数列最小的一个就是质数
写了一个,但水平不高,测试比#4慢一百倍,瓶颈在生成器和sort(),但也没想到优化方法
但思路是这样的,每添加一个质数,就把其倍数在原数列中排除,剩下的数列最小的一个就是质数
q = list(range(2, 10000))
l = []
while 1:
if len(q) <= 2:
l.extend(q)
break
else:
qs = q.pop(0)
l.append(qs)
qm = q[len(q) - 1]
q1 = set(qs * n for n in range(2, int(qm / qs) + 1))
q = list(set(q) - q1)
q.sort()
print(l)
#9
from math import sqrt
from datetime import datetime, timedelta
def P(l, n):
m = sqrt(n)
for x in l:
if x > m:
break
if n % x == 0:
return
l.append(n)
def Run(F, M):
R = []
tStart = datetime.now()
for i in range(2, M):
F(R, i)
tEnd = datetime.now()
tDelta = tEnd - tStart
print tDelta
L = len(R)
print L, R[0 : L if L < 10 else 10]
M = 1000000
Run(P, M)
有没有更快一点的?
#10
你把tStart = datetime.now()放在 import 前和后比较一下
参考#7建议
参考#7建议
#11
from time import time
t0=time()
def prime(n):
return reduce(lambda x,y: [i for i in x if i%y!=0 or i==y], range(2,int(n**0.5)+1),range(2,n+1))
print len(prime(10**5))
print time()-t0
这个算是简洁和效率比较平衡的方法,比lz的快了不少,但没有@bugs2k的快
#12
n = 1000000
a = [True] * (n + 1)
b = []
for i in range(2, int(n ** 0.5) + 1):
if a[i]:
for j in range(i, int(n / i) + 1):
a[j * i] = False
for i in range(2, n + 1):
if a[i]:
b.append(i)
print(b)
结合筛除法和开方
不会array,我水平到此为止了, 写不出更好的了
#13
楼上这个不错,简单优化一下...
a = [True] * (n + 1)
b = [2]
for i in range(3, int(n ** 0.5) + 1, 2):
if a[i]:
for j in range(i*i, n + 1, i):
a[j] = False
for i in range(3, n + 1, 2):
if a[i]:
b.append(i)
#14
谢谢,步长为2意思是奇数数列么?呵呵,少一半循环……
#15
嗯,是仅处理奇数列,貌似还不够完善,内层循环再改一下for j in range(i*i, n + 1, i
*2)