使用python找不到截断素数

2024-04-24 08:49:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我厌倦了用python在特定的数字中找到最小的右凸素数。当我试图在5位数字中找到最小的右凸素数时,代码运行得很好。然而,当我试图在6位数字中找到它时,python意外地退出了。你知道吗

这是我的密码:

    def findRTP(digits, currNum = 2):
    if digits == len(str(currNum)):return currNum
    else:
        # if digit % 2 == 0 or digit == 5:
        #     return findRTP(digits, currNum, digit+1)
        # elif (digitSum(currNum)+digit)%3 == 0:
        #     return findRTP(digits, currNum, digit+1)
        for digit in range(1, 10):
            currNum = currNum * 10 + digit
            if isPrime(currNum):
                result = findRTP(digits, currNum)
                if result != None: return result
                else: currNum //=10
            else:
                if digit >= 9:
                    currNum //= 10
                    return findRTP(digits, currNum//10)
                currNum //= 10
        return None

# def digitSum(num):
#     if num == 0:
#         return 0
#     else:
#         return num % 10 + digitSum(num // 10)

def isPrime(n):
    if (n < 2):
        return False
    if (n == 2):
        return True
    if (n % 2 == 0):
        return False
    maxFactor = round(n**0.5)
    for factor in range(3,maxFactor+1,2):
        if (n % factor == 0):
            return False
    return True

def callWithLargeStack(f,*args):
    import sys
    import threading
    threading.stack_size(2**27)  # 64MB stack
    sys.setrecursionlimit(2**27) # will hit 64MB stack limit first
    # need new thread to get the redefined stack size
    def wrappedFn(resultWrapper): resultWrapper[0] = f(*args)
    resultWrapper = [None]
    #thread = threading.Thread(target=f, args=args)
    thread = threading.Thread(target=wrappedFn, args=[resultWrapper])
    thread.start()
    thread.join()
    return resultWrapper[0]

print(callWithLargeStack(findRTP, 6))

请帮帮我。你知道吗


Tags: returnifstackdefargs数字threadelse
1条回答
网友
1楼 · 发布于 2024-04-24 08:49:01

当这个程序运行时,它以退出状态138终止,这意味着它被SIGBUS信号终止(信号#10为128+10)。你知道吗

在本例中,这是因为它超出了线程的堆栈大小。你也可以用5位数的版本来复制:将堆栈大小改为2**16。你知道吗

threading.stack_size(2**16)  # 64MB stack
...
print(callWithLargeStack(findRTP, 5))

在我的系统中,这样修改程序会产生Process finished with exit code 138,就像6位版本一样。你知道吗

这里简单的回答是递归可能不是实现您所要做的事情的最佳方法。用非递归版本替换isPrime很简单,通过一些工作,您也可以对findRTP执行同样的操作。你知道吗

相关问题 更多 >