代码之家  ›  专栏  ›  技术社区  ›  Mahmoud

[Python/Project Euler]问题41

  •  0
  • Mahmoud  · 技术社区  · 15 年前

    我正在努力解决这个问题 problem 41 ,但我不知道我的代码为什么停在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()
    

    附言:我知道我应该从799999999开始,因为:

    3 回复  |  直到 10 年前
        1
  •  10
  •   zvone    15 年前

    你的 IsPrime 功能非常慢。它很快计算出987654321可除以3,987654320可除以2。然而,987654319是素数,它需要很长时间来检查它对所有除数,所以它似乎停止了。

    • 试验 IsPandigital 之前 IsPrime公司 ,
    • 更好的是,只创建一个 泛数字与素数 [987654321,987654312,987654231,987654213,...]
    • while i < No -这就足够了 sqrt(No) .
    • 以数字0、2、4、5、6或8结尾的数字永远不是素数

    您的其他问题:

    • 你在计算最大的 9位 泛数字素数。问题是“最大的 “泛数字素数”,所以您应该能够根据参数计算任何长度
    • 你不应该像你写的那样从799999999开始。你应该跳过n=3,n=5,n=6,n=8和n=9的计算,因为它们都不是素数。
        2
  •  1
  •   EddieC    15 年前

    寻找素数的例程比泛数字要长得多,所以请切换它们运行的顺序。所以应该是:

    if IsPandigital(i) == True and IsPrime(i) == True:
    
        3
  •  1
  •   Gordon    14 年前

    例如。

    itertools.permutations('9876543210')

    你可以缩小你的搜索范围如上所述,9876543210只是一个例子。