知识介绍
一个信用卡号必须是13到16位的整数
1954年,IBM的Hans Luhn提出一种算法,用于验证信用卡号的有效性。
这个算法在确定输入的卡号是否正确,或者这张信用卡是否被扫描仪正确扫描方面是非常有用的。
银行卡的第一位数
4,指Visa信用卡
5,指Master万事达卡
37,指American Express 国际信用卡
6,指Discover 信用卡
算法介绍
遵循这个合法性检测可以生成所有的信用卡号,通常称之为Luhn检测或者Mod 10检测,可以如下描述(为了方便解释,假设卡号4388576018402626:
1.从右到左对偶数位数字翻倍。如果对某个数字翻倍之后的结果是一个两位数,那么就将这两位加在一起得到一位数。
2.现在将第一步得到的所有一位数相加。
3.将卡号里从右到左奇数位上的所有数字相加。
4.将第二步和第三步得到的结果相加。
5.如果第四步得到的结果能被10整除,那么卡号是合法的;否则,卡号是不合法的。
例如,号码4388576018402626是不合法的,但是号码4388576018410707是合法的。 编写程序,提示用户输入一个long型整数的信用卡号码,显示这个数字是合法的还是非法的
科普小知识:
1.银联卡我们一般办的卡都是银联卡,卡面上会有“银联”的字样,就是你的卡可以在不同银行的ATM机上取款。
银联是中国的银行卡发行机构,只能用人民币付款。银联不止发行借记卡还发行信用卡,大家可以这样理解,
银联卡不一定是信用卡,但信用卡基本都是银联卡。相信有朋友应该在很多国家和地区都看到了“银联”支付的标识,
对,你没看错,很多实力雄厚的银行已经跨出了中国国门,走向了世界。
所以我们在国外很多地方也是可以使用到银联卡的,当然,不同国家地区或存在一个汇率问题,可以在银行转化当地币种用,这就不做过多介绍了。2.MasterCard
MasterCard,中国名称为:万事达卡,是全球第二大信用卡国际组织,是由参加万事达卡国际组织的金融机构会员发行的,在欧洲地区的流行度相对更大一些。
3.VISAVISA,是一个信用卡品牌,就像中国的银联,VISA国际组织是目前世界上最大的信用卡国际组织,在美洲、亚洲国家等国家较为流行。
def verifyByCreditCard(verify_count, verify_match):
def verify(idcard):
sanitizedValue = idcard.replace("-", "")
numberLen = len(sanitizedValue)
alternate = False
if numberLen < 13 or numberLen > 19:
return false
# 从右到左所以反转
digits = [int(x) for x in reversed(sanitizedValue)]
# 对偶数位数翻倍 d*2
even_digits = [d*2 for d in digits[1::2]]
# 如果某个数字翻倍之后结果是一个两位数,将这两位数字加在一起
even_digits = [d // 10 + d % 10 for d in even_digits]
# 将上一步所有一位数相加
even_sum = sum(even_digits)
# 将卡号里从右向左奇数位上所有数字相加
odd_sum = sum(digits[::2])
# 将even_sum和odd_sum相加,能被10整除位合法,否则不合法
if (odd_sum + even_sum) % 10 == 0:
return True
else:
return False
count = verify_count
match = verify_match
for idcard in verify_match:
res = verify(idcard)
if not res:
count -= 1
match.remove(idcard)
return count, match