【发布时间】:2014-08-14 05:03:41
【问题描述】:
我一直在尝试创建一个程序,该程序可以根据Hans Peter Luhn's algorithm 检查信用卡号是否有效。但是,我只能让它对某些输入起作用。
// 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 测试信用卡号 page,所以我知道它们是有效的。
那我做错了什么?
通过程序澄清细节,如果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;
}
【问题讨论】:
-
您可能必须提供其余代码才能确定;尤其是
getDigit和intlen。 -
我希望那些信用卡号码不是来自真正的活跃卡...... ;)
-
@selbie:这些是测试号码。