我想打印所有素数,连续7个连续7s小于10000000000
。我在使用MemoryError
时收到range()
因为生成的数组无法存储,所以我将循环更改为while
循环。
但是程序真的很慢。打印找到的第一个数字需要一分多钟。
import math
def is_prime(n):
if n % 2 == 0 and n > 2:
return False
i = 3
while i < math.sqrt(n) + 1:
#for i in range(3, int(math.sqrt(n)) + 1, 2):
if n % i == 0:
return False
i += 2
return True
def is_super_happy(n):
count = 0
while n != 0:
if n%10 == 7:
count += 1
if count == 7:
return True
else:
count = 0
n /= 10
return count == 7
i = 7777777
while i < 10e10:
#for i in range(7777777, int(10e10)):
if is_super_happy(i) and is_prime(i):
print i
i += 1
我无法做任何可以让它变得更快的事情,而且我希望它能够非常快。
任何想法,提示?
答案 0 :(得分:2)
您当前的算法非常浪费:is_prime
会在每次迭代时检查从1到sqrt(n)
的每个数字,而它应该只检查已知的素数。
修改算法,使其实现http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
此外,您在while循环的每个刻度线上计算sqrt(n)
(如果你变得足够高,可能会有几百万次),除非它没有变化。在函数开头计算一次并重用它。
答案 1 :(得分:2)
两个建议:
直接生成小于10e10
的7位,8位和9位数字(而不是依次检查每个数字),然后检查它们。这些数字的数量相对较少。
例如,这是一种生成所有此类数字的列表的方法 end with'77777777':
7777777
考虑使用概率检验来检查素性(例如Miller-Rabin)。这会告诉您一个数字[int(str(x)+'7777777') for x in xrange(100)]
是否具有非常高概率的素数,并且可以更快地检查可能数千个小于x
的数字以进行可分性。
答案 2 :(得分:0)
我在大约四分之一秒内找到250个素数,我不想提供我的代码,因为你的问题看起来像是家庭作业。
方法:
int("12" + "7777777" + "3")
)或仅使用数学(12 * 100000000 + 7777777 * 10 + 3)生成数字