计算双阶乘的问题:计算机还是代码?

2024-09-29 21:58:46 发布

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

我正在用Python3编写一个计算器应用程序,所有的功能都很好(我想),除了我尝试使用我的double\u factorial()函数。如果我输入一个大于3的数字,程序就不会输出任何东西,我的电脑也会过热(我使用的是MacBookPro,完全定制为尽可能强大)。这要么是一个直接的计算机问题,要么是因为我的代码有问题而导致的计算机问题。作为一个初学者,我的代码是否有什么问题我可能无法发现?(注:我只发布相关部分):

def add(a,b):
    return(a + b)

def subtract(a,b):
    return(a - b)


def multiply(a,b):
    counter = 0
    for i in range(a):
        counter = add(counter, b)
    return(counter)

def divide(a,b):
    quotient = 0
    while a >= b:
        quotient = add(quotient, 1)
        a = subtract(a,b)
    return (quotient, a)

def factorial(a):
    c = 1
    while a > 1:
        c = multiply(c,a)
        a = subtract(a,1)
    return(c)

def double_factorial(a):
    og = factorial(a)
    return factorial(og)    

def equation():
    d = None    
    print("Valid operations: +, -, *, /, !, !!, =")
    c = eval(input("Integer: "))

    while d != "=":
        d = input("Operation: ")

        if d in ('+', '-', '*', '/', '!', '!!', '='):
            if d == "+":
                c = add(c, eval(input("Integer: ")))
            elif d == "-":
                c = subtract(c, eval(input("Integer: ")))
            elif d == "*":
                c = multiply(c, eval(input("Integer: "))) 
            elif d == "/":
                c = divide(c, eval(input("Integer: ")))
            elif d == "!":
                c = factorial(c)
            elif d == "!!":
                c = double_factorial(c)            
        elif d != "=":
            print("invalid")
    print(str(c))

Tags: addinputreturndefevalcounterintegermultiply
1条回答
网友
1楼 · 发布于 2024-09-29 21:58:46

4个!!= 24! 这是一个巨大的数字(粗略估计:24!>;24*5^5*10^14,意思是4!!~10^20已经接近系统最大尺寸. 你知道吗

下一个,5!!= 120! 它大得多。(120! >;gt;10^90*100^20~10^130)。你知道吗

如果您提供乘法函数的代码,它可能有助于检测到底发生了什么(理论上,Python3可以成功地计算10^100),但我怀疑您的计算机已经达到了极限。你知道吗

更新:既然已经提供了代码,那么至少还有一个潜在问题:在乘法方法中,使用range(a),它实际实例化了内存中请求的序列。假设每个int有4个字节,则至少需要*4个字节。例如,如果您的机器有1TB的可用内存(可能没有),这将限制a:a<;10^12/4的值。你知道吗

此外,您的“a”是相乘值中的较大值,因此更改发送到相乘的操作数的顺序也会有所帮助,因为这样范围会更小(对应于n!而不是部分计算n!!)你知道吗

您可以通过使用xrange(一个序列迭代器)来减轻这种情况。你知道吗

相关问题 更多 >

    热门问题