知识介绍

一个信用卡号必须是13到16位的整数

1954年,IBM的Hans Luhn提出一种算法,用于验证信用卡号的有效性。

这个算法在确定输入的卡号是否正确,或者这张信用卡是否被扫描仪正确扫描方面是非常有用的。

银行卡的第一位数

4,指Visa信用卡
5,指Master万事达卡
37,指American Express 国际信用卡
6,指Discover 信用卡

算法介绍

遵循这个合法性检测可以生成所有的信用卡号,通常称之为Luhn检测或者Mod 10检测,可以如下描述(为了方便解释,假设卡号4388576018402626:

1.从右到左对偶数位数字翻倍。如果对某个数字翻倍之后的结果是一个两位数,那么就将这两位加在一起得到一位数。

信用卡号合法性检查java 信用卡号合法性检查Python_信用卡号合法性检查java

2.现在将第一步得到的所有一位数相加。

信用卡号合法性检查java 信用卡号合法性检查Python_信用卡号合法性检查java_02

3.将卡号里从右到左奇数位上的所有数字相加。 

信用卡号合法性检查java 信用卡号合法性检查Python_数位_03

4.将第二步和第三步得到的结果相加。

信用卡号合法性检查java 信用卡号合法性检查Python_python_04

5.如果第四步得到的结果能被10整除,那么卡号是合法的;否则,卡号是不合法的。

信用卡号合法性检查java 信用卡号合法性检查Python_数位_05

例如,号码4388576018402626是不合法的,但是号码4388576018410707是合法的。 编写程序,提示用户输入一个long型整数的信用卡号码,显示这个数字是合法的还是非法的 

科普小知识:
1.银联卡

  我们一般办的卡都是银联卡,卡面上会有“银联”的字样,就是你的卡可以在不同银行的ATM机上取款。
  银联是中国的银行卡发行机构,只能用人民币付款。银联不止发行借记卡还发行信用卡,大家可以这样理解,
  银联卡不一定是信用卡,但信用卡基本都是银联卡。相信有朋友应该在很多国家和地区都看到了“银联”支付的标识,
  对,你没看错,很多实力雄厚的银行已经跨出了中国国门,走向了世界。
  所以我们在国外很多地方也是可以使用到银联卡的,当然,不同国家地区或存在一个汇率问题,可以在银行转化当地币种用,这就不做过多介绍了。

  2.MasterCard

    MasterCard,中国名称为:万事达卡,是全球第二大信用卡国际组织,是由参加万事达卡国际组织的金融机构会员发行的,在欧洲地区的流行度相对更大一些。
    3.VISA

    VISA,是一个信用卡品牌,就像中国的银联,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