这个题两段代码:第一段我自己写的,电脑差点炸了。垃圾
第二段网友写的,1.7s得出答案。流弊啊
将两段代码贴在这里,供自己日后学习研究这种效率算法代码的超一流思路
第一段
# 电脑都快爆了,还没算出答案 def isfrime(x): # if x == 2: # return True for k in range(2,x): if x % k == 0: return False return True print(2 + sum([i for i in range(3,2000000,2) if isfrime(i)]))
第二段(流弊啊,愣是看了半天才懂明白是个怎样的思路)
''' getPrime : (原理) 用的是标记法,先建一个列表,列表的项数等于要求的最大质数,内容都为True。 然后第0,1项设为False,因为0和1都不是质数。 从第2项开始,是2的倍数的项都是设为假,因为都不是质数。 然后只要是列表内还没有设为假的数,从它开始,它的倍数都设为假,直到列表内全部为真的数,那就是质数。 原理就是这样。 利用列表的项数和列表值的对应关系。这样可以减少判断次数,当然速度就是最快的了。 ''' def run4(n): primes = [True]*n primes[0],primes[1]=False,False for (i, prime) in enumerate(primes): if prime: # 这一步思路最是流弊啊 for j in range(i*i,n,i): primes[j] = False return [k for (k,trueprime) in enumerate(primes) if trueprime] print (sum(run4(2000000)))