Why do i keep getting " ValueError: invalid literal for long() with base 10: '5-1'

Why do i keep getting " ValueError: invalid literal for long() with base 10: '5-1'

我认为错误意味着它正在接收一些其他数据类型,尽管它期望另一种数据类型,但我可能是错的,因为我是 python.Anyone 的初学者知道如何解决这个问题吗?

#Program to calculate factorial of a long number

def multiply(multiplier,multiplicand):

    a = long(''.join(multiplier))
    b = long(''.join(multiplicand))
    a = a*b
    multiplier = list(str(a))
    b = b-1
    multiplicand = list(str(b))
    if(b == 1):
        return False,multiplier,multiplicand
    else:
        return True,multiplier,multiplicand


num = ""
f = True # A flag variable
while(f):                 #checks if the string consists of digits only
        num = raw_input("Enter number:")  
        f = False
        if num.isdigit() == False:
                print "oops,try again!"
                f = True
multiplier = list(num)
multiplicand = multiplier[:]
multiplicand.pop()
multiplicand.insert(len(multiplier),str(long(multiplier[-1])-1)) #mand now contains   multiplier -1 in list form 

f = True
while (f):
        f,multiplier,multiplicand = multiply(multiplier,multiplicand)
num = ''.join(multiplier)
print num  #print the ans as a string 

只要输入的值低于 50,代码运行正常,但在 50 之后显示错误:

Traceback (most recent call last):
File "test.py", line 31, in <module>
    f,multiplier,multiplicand = multiply(multiplier,multiplicand)
File "test.py", line 5, in multiply
    b = long(''.join(multiplicand))
ValueError: invalid literal for long() with base 10: '5-1'

“5-1”是什么意思?

您正在将多位数字视为列表,并重新实现减法。你想要mand = mplier - 1。由于 mplier 是一个数字列表(不需要这个,答案末尾有更多信息),您假设 mand 应该与 mplier 相同,除了最后一个数字, 应该是 mplier 的最后一位减去 1.

这适用于不以 0 结尾的数字:['5', '3'] 会变成 ['5', '2'],但 ['5', '0'] 会变成 ['5', '-1'],而不是 ['4', '9'] .当您尝试在 b = long(''.join(mand)) 中重新组合您的号码时,您最终会得到 b = long('4-1'),而 '4-1' 不是一个号码,因此您会得到一个例外。

Python does not have a precision limit on integer numbers,所以你不需要区别对待长数字。

我已经重写了你的代码以防它有用:

#Program to calculate factorial of a long number

def factorial(n):
    result = 1
    for r in xrange(0, n):
        result = result * (r+1)
    return result

num = 0

while(True):                 #checks if the string consists of digits only
        num = raw_input("Enter number:")
        if not num.isdigit():
                print "oops,try again!"
        else:
            num = int(num)
            break

print factorial(num)

另外,作为旁注,代码令人困惑,我花了一些时间才明白你在做什么。您可能会从 CodeReview 中获益,以学习最佳实践(有用的变量名、摆脱无用的变量、适当的代码文档、最新技术...)。