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 中获益,以学习最佳实践(有用的变量名、摆脱无用的变量、适当的代码文档、最新技术...)。
我认为错误意味着它正在接收一些其他数据类型,尽管它期望另一种数据类型,但我可能是错的,因为我是 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 中获益,以学习最佳实践(有用的变量名、摆脱无用的变量、适当的代码文档、最新技术...)。