我试图创建一个程序,根据用户输入的数字字符串检查任何长度的UPC代码(尽管大多数是12位)的有效性。我目前的方法是首先将字符串存储到列表中,然后使用“for in range”遍历列表
我使用的UPC代码验证算法的工作原理如下:(UPC代码的设计部分是为了防止收银员在结账时输入错误,因为一个错误的数字可能会使代码无效)
验证过程从右到左运行。
对于偶数位置的数字,没有变化。
对于奇数位置的数字,将数字乘以3。
对结果求和。
对于有效的UPC数字,此总和将是10的倍数。
我已经能够像我所希望的那样运行一切除了准则1,验证过程从右到左发生在UPC代码中的数字串上。我现在的方法是从左到右。如果用户输入的UPC代码是奇数位数,这将证明是一个问题,因为它会使算法失效。
下面def upc_check(code):
中的输入code
是用户输入的UPC代码,以查看UPC代码是否有效。你知道吗
def upc_check(code):
ODD_DIGIT_MULTIPLIER = 3
UPC_VALIDITY_DIVISOR = 10
digits = []
for num in code:
digits.append(int(num))
print(digits)
check_sum = 0
for i in range(0, len(code)):
if (i + 1) % 2 != 0:
check_sum += (ODD_DIGIT_MULTIPLIER * digits[i])
else:
check_sum += (digits[i])
if check_sum % UPC_VALIDITY_DIVISOR == 0:
return "Valid UPC code."
else:
return "Invalid UPC code."
目前,输出与我期望的一样(即有效的UPC代码显示为有效,无效的UPC代码显示为无效),但算法是从左到右遍历数字字符串。你知道吗
从右到左,我希望我可以进行以下替换并获得相同的结果:
for i in range(0, len(code)):
与
for i in range(-1, -len(code), -1):
这将使代码如下所示:
def upc_check(code):
ODD_DIGIT_MULTIPLIER = 3
UPC_VALIDITY_DIVISOR = 10
digits = []
for num in code:
digits.append(int(num))
print(digits)
check_sum = 0
for i in range(-1, -len(code), -1):
if (i + 1) % 2 != 0:
check_sum += (ODD_DIGIT_MULTIPLIER * digits[i])
else:
check_sum += (digits[i])
if check_sum % UPC_VALIDITY_DIVISOR == 0:
return "Valid UPC code."
else:
return "Invalid UPC code."
但是,当我进行此更改时,所有有效的UPC代码现在返回值invalid,我不确定原因。我希望输出是相同的。有人有什么建议吗?谢谢你的帮助!你知道吗
如果有助于检查,以下是有效的UPC代码:
096619363148号
017082886026
381370036005号
以下是一些无效的UPC代码(上面代码的故意输入错误):
096619363149
017082786026
381370036015号
如果代码从左到右按预期工作,保持大部分代码不变的快速方法是在for循环之前反转数字列表。你知道吗
所以
digits = digits.reverse()
和for循环的第一行可以保持原样for i in range(0, len(code)):
我将对此进行测试,并很快更新我的答案。你知道吗
你需要的有点复杂。默认情况下,范围不会完全覆盖。你知道吗
等会工作,但不觉得我是非常啃老族。我不知道另一种方法,也许别人知道?你知道吗
相关问题 更多 >
编程相关推荐