Python程序因输入大于3位而失败
我正在这样做,我的代码失败,最大值超过999,但在此之前工作正常 “计数”停止在22,不计算任何超过999的素数Python程序因输入大于3位而失败,python,Python,我正在这样做,我的代码失败,最大值超过999,但在此之前工作正常 “计数”停止在22,不计算任何超过999的素数 import itertools import time def isPrime(n): if n % 2 == 0: return n == 2 d = 3 while d * d <= n: if n % d == 0: return False d += 2 retu
import itertools
import time
def isPrime(n):
if n % 2 == 0:
return n == 2
d = 3
while d * d <= n:
if n % d == 0:
return False
d += 2
return True
t=time.time()
count=0
Range=1000000
for a in range(2,Range):
if isPrime(a):
alist=[]
perms=[]
for n in str(a):
alist.append(n)
for n in itertools.permutations(alist):
num=int("".join(n))
perms.append(num)
if all(isPrime(l) for l in perms):
count+=1
print("there are ", count, " circular primes")
print("time=",time.time()-t,"s")
导入itertools
导入时间
def iPrime(n):
如果n%2==0:
返回n==2
d=3
而d*d前四位循环素数是(我想)1193。最简单的故障排除方法就是看看这个数字会发生什么。问题是,itertools.permutations
生成所有置换,而不是循环旋转。1193的循环旋转为
[1193, 3119, 9311, 1931]
您的代码正在生成一个更大的列表:
[1931, 1913, 1391, 1319, 1193, 1139, 9131, 9113, 9311, 9311, 9113, 9131, 3191, 3119, 3911, 3911, 3119, 3191, 1193, 1139, 1913, 1931, 1319, 1391]
例如,1391不是素数。前四位循环素数是(我想)1193。最简单的故障排除方法就是看看这个数字会发生什么。问题是,itertools.permutations
生成所有置换,而不是循环旋转。1193的循环旋转为
[1193, 3119, 9311, 1931]
您的代码正在生成一个更大的列表:
[1931, 1913, 1391, 1319, 1193, 1139, 9131, 9113, 9311, 9311, 9113, 9131, 3191, 3119, 3911, 3911, 3119, 3191, 1193, 1139, 1913, 1931, 1319, 1391]
例如,1391不是质数。您没有看到问题所在。你只需要旋转,而不是所有的排列
这将生成要测试的旋转:
a_str = str(a)
perms = [ int(a_str[i:] + a_str[0:i]) for i in range(1,len(a_str)) ]
你没有读到这个问题。你只需要旋转,而不是所有的排列
这将生成要测试的旋转:
a_str = str(a)
perms = [ int(a_str[i:] + a_str[0:i]) for i in range(1,len(a_str)) ]
定义“失败”?它是否抛出异常,计算错误?那么,您是否也尝试输出素数列表?你怎么知道22是错的?等等……是的,我试过了所有这些,循环素数的wiki给出了很多以上的值。您可能内存不足,请尝试从range()
切换到xrange()
,因为后者占用的空间更少。还可以使用itertools
查看下面的其他答案,以获得更好的问题解决方案。定义“失败”?它是否抛出异常,计算错误?那么,您是否也尝试输出素数列表?你怎么知道22是错的?等等……是的,我试过了所有这些,循环素数的wiki给出了很多以上的值。您可能内存不足,请尝试从range()
切换到xrange()
,因为后者占用的空间更少。另外,请查看下面的其他答案,以便使用itertools
更好地解决此问题。啊,就是这样,我认为这是一个愚蠢的错误,谢谢!啊,就是这样,我觉得这是个愚蠢的错误,谢谢!