zoukankan      html  css  js  c++  java
  • iOS 信用卡/银联卡校验-Luhn算法

    一、Kuhn算法
        检验数字算法(Luhn Check Digit Algorithm),也叫做模数10公式,是一种简单的算法,用于验证银行卡、信用卡号码的有效性的算法。对所有大型信用卡公司发行的信用卡都起作用,这些公司包括美国Express、护照、万事达卡、Discover和用餐者俱乐部等。这种算法最初是在20世纪60年代由一组数学家制定,现在Luhn检验数字算法属于大众,任何人都可以使用它。
     
    二、校验过程:
        1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
        2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
        3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
     
    例如:卡号为4514617608810943
        1) 奇数位和:3+9+1+8+6+1+4+5 = 37
        2) 偶数位和:4*2+0*2+(8*2-9)+0*2+(7*2-9)+(6*2-9)+1*2+4*2 = 33
        3) 余数为0则是银行卡:(37+33)/10 = 0
     
    另外:
      1、卡号位数少于14的基本是外资银行或小银行
      2、卡号位数多余23的大多是卡号包含字母或空格
      3、国内主流的银行(中、农、工、建、招、交等)基本都是基于16位或者19位的卡号
     
    不符合Luhn算法的银行卡:
        1、招商银行的运通卡
        2、江苏银行有些卡号不符合
        
     注意:
      并非所有信用卡银行卡都符合Luhn算法、所以即使用户填写的卡号违反了该规则,我们应该仍然运行用户的填写,但可以给出相应的警示内容,提示用户可能填错了
     
    OC实现 
    -(BOOL)checkCardNumber:(NSString *)cardNumber{   // 4514617608810943
        int sum = 0;
        NSUInteger cardNumLength = [cardNumber length];
        int i = 0;
        
        while (i < cardNumLength) {
            NSString *subStr = [cardNumber substringWithRange:NSMakeRange(cardNumLength - 1 - i, 1)];
            int subInt = [subStr intValue];
            if (i % 2 != 0) {
                subInt *= 2;
                if(subInt > 9) {
                    subInt -= 9;
                }
            }
            sum += subInt;
            i++;
        }
        
        if((sum % 10) == 0) {
            return YES;
        } else {
            return NO;
        }
    }
     
     
  • 相关阅读:
    hdu 1199 Color the Ball 离散线段树
    poj 2623 Sequence Median 堆的灵活运用
    hdu 2251 Dungeon Master bfs
    HDU 1166 敌兵布阵 线段树
    UVALive 4426 Blast the Enemy! 计算几何求重心
    UVALive 4425 Another Brick in the Wall 暴力
    UVALive 4423 String LD 暴力
    UVALive 4872 Underground Cables 最小生成树
    UVALive 4870 Roller Coaster 01背包
    UVALive 4869 Profits DP
  • 原文地址:https://www.cnblogs.com/10-19-92/p/6762655.html
Copyright © 2011-2022 走看看