【发布时间】:2011-01-25 12:03:07
【问题描述】:
我正在尝试解决Project Euler's problem #35
数字 197 被称为圆素数,因为数字的所有旋转:197、971 和 719 本身都是素数。
一百万以下有多少个圆素数?
这是我的解决方案:
import numpy as np
def problem(n=100):
circulars = np.array([], np.int32)
p = np.array(sieveOfAtkin(n), np.int32)
for prime in p:
prime_str = str(prime)
is_circular = True
for i in xrange(len(prime_str)):
m = int(prime_str[i:]+prime_str[:i])
if not m in p:
is_circular = False
if is_circular:
circulars = np.append(circulars, [prime])
return len(circulars)
不幸的是 for 循环非常慢!有什么想法可以加快速度吗? 我怀疑字符串连接是瓶颈,但我不完全确定! :)
有什么想法吗? :)
【问题讨论】:
-
你为什么要使用字符串?
-
不要为
circulars使用 NumPy 数组——它具有固定大小,需要在 每次 调用numpy.append()时重新分配。 Python 列表是这里更好的选择。 (删除 numpy 标签,因为问题和当前答案都与 numpy 无关。)