Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
[Python/Project Euler]问题41_Python - Fatal编程技术网

[Python/Project Euler]问题41

[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

我正在尝试解决,但我不知道为什么我的代码在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 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生成所有pan数字,然后检查它们是否为素数。它生成所传递字符串的所有排列

例如

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)],[])]
。这可以通过我上面的提示进一步优化,但即使这样也足以在几秒钟内解决问题。。。