【问题标题】:Why does this while loop stop without throwing error?为什么这个while循环停止而不抛出错误?
【发布时间】:2019-05-16 19:31:31
【问题描述】:

试图找到输出匹配条件。遍历while循环,增加变量,但是当num = 239时程序似乎停止并且不知道为什么。当我手动尝试每个功能时,程序运行良好。

def is_prime(num):
    if num > 1:
        for i in range(2,num):
            if (num % i) == 0:
                return(False)  
                break
        else:
            return(True)

def calc(num):
    x = (num ** num) + 2
    return(x)

def get_next_prime(num):
    num += 1
    while True:
        if is_prime(num):
            return(num)
            break
        else:
            num += 1

def check(num):
    while True:
        if is_prime(calc(num)) and is_prime(num):
            return(num)
            break
        else:
            num = get_next_prime(num)
            print(num)




print(check(4))

预期的结果是以239之后的下一个素数的形式继续迭代输出。

【问题讨论】:

  • 旁白:请检查如何有效地计算一个数是否为素数。
  • 我有并且这个功能有效。我用 237、238、239、240 对其进行了测试,所有输出都是正确的。
  • is_prime 中,您可以使用 for i in range(2,num): 代替 for i in range(2, int(math.sqrt(num)) + 1):,这将为您节省大量无用的计算。 return 之后的 break 也是没用的。还有return(False) -> return False
  • 高效:我的意思是,您可以通过测试直到数字平方根的除数而不是数字本身来测试数字是否为素数。
  • 阅读ericlippert.com/2014/03/05/how-to-debug-small-programs 了解调试代码的技巧。这将帮助您了解它意外退出的原因。

标签: python primes


【解决方案1】:

虽然没有停止,但它的处理过程。在处理过程中消耗大量时间。

def is_prime(num):
if num > 1:
    for i in range(2,num):
        if (num % i) == 0:
            return(False)  
            break
    else:
        return(True)

上面的函数导致240^240 smth 如下所示。

42200323427409150751742179532592018252808661114071266629718376939092568551075505740268077803623642715001998769421215763628719631633378375087756319383725641630331895773386010866243028159828607385899087848942302738709343403640250275314218243930567432731458807734886574283968918955323573297631562415292893276034393336066052132808455118105272470307339550216091253570417050545677371810192238471803263478546492058686483752405946094606978411379079233793804753705243644236607675749522119768311584522527886912942059070222789851175661909205254663263392466134105108288691503106

在您的代码中,is_prime(calc(num)) 正在检查从 2 到以上数字的每个整数。所以很费时间。

建议使用 vscode 或其他调试工具。

如果您将 print 用于调试目的,请替换 print(check(239)),然后将 print 放入第 4 行以查看您的调试结果。

def is_prime(num):
if num > 1:
    for i in range(2,num):
        print(i)
        if (num % i) == 0:
            return(False)  
            break
    else:
        return(True)

【讨论】:

    【解决方案2】:

    问题似乎是 239 是第一个素数,确定 239 ** 239 + 2 是否是素数并非易事。在此之前,计算出的数字很容易通过主要测试(5 的倍数等)。下面是我对您的代码的清理,以使其更清楚(至少对我而言)正在发生的事情。它包含了 cmets 中建议的一些优化,但这没什么区别。它仍然停留在 239:

    def is_prime(number):
    
        if number < 2:
            return False
    
        if number % 2 == 0:
            return number == 2
    
        i = 3
    
        while i * i <= number:
            if number % i == 0:
                return False
    
            i += 2
    
        return True
    
    def calculate(odd_prime):
        return odd_prime ** odd_prime + 2
    
    def get_next_odd_prime(odd_number):
    
        while True:
            odd_number += 2
    
            if is_prime(odd_number):
                return odd_number
    
    def check(odd_prime):
        while True:
            if is_prime(calculate(odd_prime)):
                return odd_prime
    
            odd_prime = get_next_odd_prime(odd_prime)
    
            print(odd_prime)
    
    print(check(5))
    

    由于 3 通过了这个测试(3 ** 3 + 2 == 29 也是素数),我们从下一个更高的奇素数开始,因为大于 2 的偶数没有意义。

    人们可能会建议使用 Eratosthenes 的筛子作为更好的主要测试 - 请小心。由于内存分配问题,任何依赖于数组结构的简单 sieve 实现都会在创建一个小至11 ** 11 + 2 左右的Python 列表时遇到问题。我不知道一个只表示奇数的位向量可以走多大。

    【讨论】:

      猜你喜欢
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 2022-09-25
      • 2021-11-28
      相关资源
      最近更新 更多