当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号都是合法的,它必须通过Luhn算法来验证通过。校验过程如下:
(1)从卡号最后一位数字开始,逆向将奇数位相加;
(2)从卡号最后一位开始,逆向将偶数位数字,先乘以2(如果乘积为2位数,则将其减去9),再求和。
(3)将奇数位总和加是偶数位总和,结果应该可以被10整除。
例如,卡号是5432123456788881,则用颜色标识一下奇数位,如下:
5432123456788881
奇数位求和为:4+2+2+4+6+8+8+1=35;
偶数位乘2的结果:1 6 2 6 15 7 7,求和为35
二者相加为70,可以被10整除,认定校验通过。
试编写一个程序,判断一个卡号是否校验通过。
参考代码如下:
#include <stdio.h>
#include <string.h>
void main(){
char a[16];
printf("please input the card number:");
scanf("%s",a);
if (strlen(a)!=16)
printf("the length of the card number is not 16.");
else{
int flag=0;
for(int i=0;i<16;i++){
if (a[i]<'0' || a[i]>'9'){
flag=1;
break;
}
}
if (flag==1)
printf("the number contains illegal symbol.");
else{
int odd, even;
odd=0; even=0;
for(int i=0;i<16;i++){
if (i%2==0){
even+=(a[i]-'0')*2>9?(a[i]-'0')*2-9: (a[i]-'0')*2;
}
else{
odd+=a[i]-'0';
}
}
if ((odd+even)%10==0)
printf("yes");
else
printf("no");
}
}
}