算法比较简单。
1、除去校验位后,从右至左,将卡号按位编码,从0开始。
2、将偶数位×2,得到的结果按位相加,比如偶数为6,×2=12,则将1和2相加=3;奇数位则直接参与相加;
3、重复步骤2得到总和,该总和加上校验位应能被10整除,否则校验位不正确。
图解:
设卡号:
1 3 8 6 2 6 7 1 8 check
×2 = 2 16 4 14 16
————————————————————–
2 +3+1+6+6+4+6+1+4+1+1+6 = x
(( x + check )%10 == 0 )
BOOL LuhmCheck( LPCSTR lpszCard, BOOL bCheck = TRUE )
{
int nLength = strlen( lpszCard );
if( nLength != 16 && nLength != 19 )
return FALSE;
if( !bCheck )
return TRUE;
int nCheck = ( lpszCard[ nLength - 1 ] - '0' );
int sum = 0;
nLength -= 2;
for( int i = 0; i <= nLength; ++ i )
{
int j = nLength - i;
int w = lpszCard[ j ] - '0';
if( i % 2 == 0 )
{
int n = w * 2;
if( n > 9 )
{
sum += ( n % 10 );
sum += ( n / 10 );
}
else
sum += n;
}
else
{
sum += w;
}
}
if(( sum + nCheck ) % 10 == 0 )
return TRUE;
else
return FALSE;
}