[Python/Project Euler]问题41
我正在尝试解决,但我不知道为什么我的代码在987654319处停止:[Python/Project Euler]问题41,python,Python,我正在尝试解决,但我不知道为什么我的代码在987654319处停止: def IsPandigital(No): a = sorted(str(No)) for i in range(1,10): if a[i - 1] != str(i): return False return True def IsPrime(No): i = 2 while i < No: if No % i == 0: return False i += 1 return Tr
def IsPandigital(No):
a = sorted(str(No))
for i in range(1,10):
if a[i - 1] != str(i):
return False
return True
def IsPrime(No):
i = 2
while i < No:
if No % i == 0:
return False
i += 1
return True
i = 987654321
while i > 0:
print i
raw_input()
if IsPrime(i) == True and IsPandigital(i) == True:
print i
break
i -= 1
print i
print "EOP"
raw_input()
def IsPandigital(否):
a=已排序(str(No))
对于范围(1,10)内的i:
如果a[i-1]!=str(一):
返回错误
返回真值
def iPrime(否):
i=2
而我<否:
如果没有%i==0:
返回错误
i+=1
返回真值
i=987654321
当i>0时:
打印i
原始输入()
如果IsPrime(i)=真且IsPandigital(i)=真:
打印i
打破
i-=1
打印i
打印“EOP”
原始输入()
我知道我应该从79999999开始,因为:
格格斯:每9位和8位的泛数字可被3整除
查找素数的例行程序比泛数字要花更长的时间,因此请切换它们的运行顺序。因此,它应该是:
if IsPandigital(i) == True and IsPrime(i) == True:
您的
IsPrime
功能非常慢。它很快计算出987654321可以除以3,987654320可以除以2。然而,987654319是素数,它需要很长时间来检查它与所有除数,所以它似乎停止了
这个问题需要的不仅仅是简单的计算,就像你做的那样。计算素数是一个缓慢的过程,因此您应该对其进行优化,例如:
- 在
之前测试IsPrime
IsPandigital
- 更好的是,只创建一个
泛数字与素数
测试。提示:泛数字是:
[9876543219876543129887654231987654213,…]
- 当我<
没有-这就足够了
sqrt(否)
- 以数字0、2、4、5、6或8结尾的数字永远不是素数
- 另一种选择可能是计算所有n位素数,然后选择最大的泛数字
- 您正在计算最大的9位泛数字素数。问题是“最大的n位泛数字素数”,因此您应该能够根据参数计算任意长度
- 正如您所写,您不应该从79999999开始。你应该跳过n=3,n=5,n=6,n=8和n=9的计算,因为它们都不是素数
itertools.permutations('9876543210')
如上文所述,您可以缩小搜索范围,9876543210只是一个示例。不要测试任何大于
sqrt(No)
的值作为素数。如果您没有赋值,x,那么如何创建一个只包含泛数字的列表呢?我被困在这一点上了列一个从1到9的列表-列一个字符串表示的列表-列一个以“1”开头的所有子列表-列所有这些子列表的所有置换-将这些置换链接在一起-将每个置换连接到一个字符串-将每个字符串转换为int查看itertools模块,尽可能地让它懒惰。@Goblin我不想给你一个完整的解决方案;)但这里有一个所有泛数字的列表:[int(''.join(map(str,x)))表示x的和([list(排列(范围(1,长度+1),长度))表示范围(1,9+1)],[])]
。这可以通过我上面的提示进一步优化,但即使这样也足以在几秒钟内解决问题。。。