信用卡号码的校验用的是Luhn算法: 旧IBM的工程师Hans Peter Luhn在1954年发明的。
当时被申请为专利,现在已经公开,进入公共知识领域,成为国际标准组织的一项标准: ISO/EC 7812-1。
- 从卡号最后一位数字开始,逆向将奇数位数字相加求和
- 从卡号最后一位数字开始,逆向将偶数位数字,先乘以2,如果乘积为两位数,则减去9 (或两位数字求和),再求和
- 将奇数位总和加上偶数位总和,结果可以被10整除。
1 int luhnCheck(vector<int> &digitNums) 2 { 3 int sz = digitNums.size(); 4 int sum = 0; 5 for (int i=1; i <= sz; i++) 6 { 7 if (i%2 == 0) 8 { 9 int val = digitNums[sz-i] * 2; 10 if (val > 9) 11 { 12 val -= 9; 13 } 14 sum += val; 15 } 16 else 17 { 18 sum += digitNums[sz-i]; 19 } 20 } 21 cout<<"check sum: "<<sum<<endl; 22 if (sum%10 == 0) 23 { 24 return 1; 25 } 26 27 } return 0;