编码问题与预期不符:程序成功执行,但是与预期结果不相符
原问题:
编写一个程序来读取一行用空格分隔的信用卡号码,并使用 "卢恩算法 "来检查该卡号是否有效。
注意:这在现实世界中是不完全一样的。在这个练习中,我们需要检查校验码是否正确。检查数字的计算方法如下:
我的解答和实际结果:
问题出现在第二个测试用例中,输入的信用卡号包含了括号和下标,这样的字符串无法被正确解析成数字进行计算。需要对输入进行预处理,将括号和下标去除,只保留数字部分进行计算。可以使用正则表达式进行匹配和替换。示例代码如下:
import re
def validate_credit_card_number(card_number):
# 去除括号和下标,只保留数字部分
card_number = re.sub(r'[^\d]+', '', card_number)
# 切掉校验位
check_digit = int(card_number[-1])
card_number = card_number[:-1]
# 计算校验和
total = 0
for i, digit in enumerate(reversed(card_number)):
if i % 2 == 0:
total += int(digit)
else:
doubled = int(digit) * 2
total += doubled // 10 + doubled % 10
# 计算校验码
checksum = 10 - total % 10
if checksum == 10:
checksum = 0
# 比较校验码和输入的校验位
return checksum == check_digit
测试代码:
assert validate_credit_card_number('4111-1111-1111-1111') == True
assert validate_credit_card_number('4111 1111 1111 1111') == True
assert validate_credit_card_number('5500 0000 0000 0004') == True
assert validate_credit_card_number('340000000000009') == True
assert validate_credit_card_number('6011 1111 1111 1117') == True
assert validate_credit_card_number('30569309025904') == True
assert validate_credit_card_number('1234 5678 9012 3456') == False