我试图创建一个基于python的ISBN13有效性计算器,它应该根据下面的代码片段工作。它接受string类型的参数并打印结果。你知道吗
我不明白我哪里出错了,在这个程序中,常识告诉我num
会给出3或1。你知道吗
def isbncheck(isbn):
num = int(0)
for i in range(0,12):
if num % 2 is 1:
num = num + (int(isbn[i])*3)
print(isbn[i] + " * 3 + at i=" + str(i))
elif num % 2 is 0:
num = num + (int(isbn[i]))
print(isbn[i] + " * 1 + at i=" + str(i))
else:
print("Unhandled Exception.")
print("_"*7)
print(num)
num = num%10
print(num)
print(isbn[12])
print(int(isbn[12]))
if num != int(isbn[12]):
print("This is not valid")
else:
print("It is Valid.")
print(isbncheck("9788177000252"))
我希望输出是1和3的交替因子。相反,我得到了这个:
9 * 1 + at i=0
7 * 3 + at i=1
8 * 1 + at i=2
8 * 1 + at i=3
1 * 1 + at i=4
7 * 3 + at i=5
7 * 1 + at i=6
0 * 3 + at i=7
0 * 3 + at i=8
0 * 3 + at i=9
2 * 3 + at i=10
5 * 3 + at i=11
_______
96
6
2
2
This is not valid
None
你是怎么解决的?除了不扩大循环?你知道吗
根据ISBN规范,3每隔一个数字出现一次,因此if语句应该是
if i % 2 is 1:
,而不是if num % 2 is 1:
(elif应该相应地更改)。你知道吗另外,必须取10减去模运算的结果;因此在
num = num%10
之后,您将得到新行num = 10 - num
。否则,计算的校验位(num
)将不正确。你知道吗另一个注意:
is
只适用于一些实现来比较-1和256之间的数字(source),这就是为什么它在这种情况下工作的原因。但一般来说==
更适合比较两个数字。你知道吗你的问题是:
num
是您的累计金额。你必须检查索引,而不是目前为止的总和。你知道吗还要注意一些小的改进:
int
,并将其保存在一个临时的digit
中。你知道吗==
进行数值比较;is
提供对象比较,这在一般情况下会失败。你知道吗相关问题 更多 >
编程相关推荐