【发布时间】:2019-04-13 10:37:23
【问题描述】:
这是我要解决的问题。
数字 197 被称为圆素数,因为 数字:197、971 和 719 本身就是质数。
100 以下的素数有 13 个:2、3、5、7、11、13、17、31、 37、71、73、79 和 97。
一百万以下有多少个圆素数?
这是我的尝试。我首先将所有低于 1000000 的素数放在一个称为素数的列表中,然后计算它们所有可能的排列并将这些排列存储在一个列表中。然后我检查了这些排列是否是素数。
import math
def isPrime(num):
flag = 1
root = int(math.sqrt(num) + 1)
for i in range (2,root+1):
if num%i == 0:
flag = 0
break
else:
flag = 1
if flag == 1:
return True
else:
return False
primes = [#list of all primes below 1000000]
def permutations(word):
if len(word) == 1:
return [word]
char = word[0]
perms = permutations(word[1:])
result = []
for perm in perms:
for i in range (len(perm)+1):
result.append(perm[i:] + char + perm[:i])
return result
count = 0
for i in primes:
to_be_tested = permutations(str(i))
count_to_be_fulfilled = len(to_be_tested)
new_count = 0
for j in to_be_tested:
if isPrime(int(j)):
new_count += 1
if new_count == count_to_be_fulfilled:
count += 1
print(count)
我得到的答案是 22,但根据 Project Euler,这是错误的。我不知道答案,因为我想自己解决这个问题,不想作弊。请告诉我我做错了什么。
【问题讨论】:
-
另外这段代码需要大约 5 分钟才能执行,所以如果有更有效的方法,请告诉我。
-
我没有时间浏览代码,但如果你使用集合而不是列表,它会更快
-
而且由于列表中已经有素数(或者如果您更改了集合),您可以检查该数据结构中是否有一个数字来测试它是否是素数
-
同意@Kacper 使用集合。在这里查看加快列出素数的速度:stackoverflow.com/questions/2068372/…。对于您的排列函数,我认为您可以通过使用字符串将一位数字从前到后循环 n 次(其中 n 是素数的长度)来简化它。使用简化函数创建一组潜在的圆形素数,并使用交集来检查该集合是否确实是一组素数。
-
这个问题只涉及rotations,那么你为什么要生成(和测试)候选编号的所有排列?您是否针对问题中显示的素数 197 运行了代码?
标签: python python-3.x permutation primes