-3

试图找到输出匹配条件。遍历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 之后的下一个素数的形式继续迭代输出。

4

2 回答 2

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如下。

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)
于 2019-05-16T19:52:28.507 回答
0

问题似乎是 239 是第一个素数,确定是否239 ** 239 + 2是素数并非易事。在此之前,计算出的数字很容易通过主要测试(5 的倍数等)。下面是我对代码的清理,以使其更清楚(至少对我而言)正在发生的事情。它包括评论中建议的一些优化,但这没什么区别。它仍然停滞在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 筛子作为更好的主要测试——要小心。由于内存分配问题,任何依赖数组结构的简单筛子实现都会在创建 Python 列表时遇到问题。11 ** 11 + 2我不知道一个只代表奇数的位向量可以走多远。

于 2019-05-17T06:18:40.467 回答