我一直在尝试创建一个程序,可以根据Hans Peter Luhn 的算法检查信用卡号是否有效。但是,我只能让它适用于某些输入。
// Loop through every digit in the card number
for ( int i = 0; i < intlen (num); ++i )
{
nextDigit = getDigit (num, i);
// If every other number...
if ( i % 2 )
{
nextDigit *= 2;
// ...times by two and add the individual digits to the total
for ( int j = 0; j < intlen (nextDigit); ++j )
{
total += getDigit (nextDigit, j);
}
}
else
{
total += nextDigit;
}
}
当我使用AMEX
卡号378282246310005
时,它可以正常工作并告诉用户它是有效的。但是,一旦我尝试了VISA
卡号4012888888881881
,它就说它无效。我尝试进行完整性检查并手动进行以查看我的程序是否错误,但我推断出相同的结果。这些卡号取自 Paypal 测试信用卡号页面,所以我知道它们是有效的。
那么我做错了什么?
通过程序澄清细节,如果total modulo 10 == 0
卡号是有效的。
调用的函数:
// Function to return length (number of digits) of an int
int intlen (long long n)
{
int len = 1;
// While there is more than 1 digit...
while ( abs (n) > 9 )
{
// ...discard leading digits and add 1 to len
n /= 10;
++len;
}
return len;
}
// Function to return a digit in an integer at a specified index
short getDigit (long long num, int index)
{
// Calculating position of digit in integer
int pos = intlen (num) - index;
// Discard numbers after selected digit
while ( pos > 1 )
{
num /= 10;
--pos;
}
// Return right-most digit i.e. selected digit
return num % 10;
}