我构建了一些代码来模拟Luhn的算法来检查信用卡的有效性。它成功地识别了美国运通卡(以34
或37
开头的15位数字(,但当我尝试万事达卡(以51
、52
、53
、54
或55
开头的16位数字(时,它无法识别它们。Visa卡有13或16位数字,以数字4
开头,我的代码似乎能正确识别16位的情况,但不能识别13位的情况。我已经查看了我的代码,并仔细检查了我的数字范围,我似乎无法准确诊断为什么有些卡通过了,而另一些卡没有。如有任何帮助,我们将不胜感激。
编辑:
我几乎解决了这个问题,我修改了它,现在所有的卡号都检查出来了,但现在它将一个无效号码(4111111111111113
(识别为Visa。这是我更新的代码:
#include <math.h>
#include <cs50.h>
#include <stdio.h>
long long number;
int main(void)
{
long long i = 0;
long long b;
long long m = 10;
long long n = 1;
number = get_long_long("Number?n");
do
{
long long a = number % m;
b = number - a;
long long c = b % (m * 10);
long long d = c / m;
long long e = d * 2;
if (e < 9)
{
i = i + e;
}
else
{
i = i + (e - 10 + 1);
}
{
m = m * 100;
}
}
while (b > 0);
do
{
long long a = number % n;
b = number - a;
long long c = b % (n * 10);
long long d = c / n;
long long e = d;
if (e < 9)
{
i = i + e;
}
else
{
i = i + (e - 10 + 1);
}
{
n = n * 100;
}
}
while (b > 0);
int f = i % 10;
if (((f == 0) && (number > 339999999999999) && (number < 350000000000000)) || ((number > 369999999999999) && (number < 380000000000000)))
{
printf("AMEXn");
}
else
if ((f == 0) && (number > 5099999999999999) && (number < 5600000000000000))
{
printf("MASTERCARDn");
}
else
if (((f == 0) && ((number > 3999999999999) && (number < 5000000000000))) || ((number > 3999999999999999) && (number < 5000000000000000)))
{
printf("VISAn");
}
else
{
printf("INVALIDn");
}
}
我发现您在验证某些卡的长度时遇到了问题。要修复此问题,请使用一个自动检查长的长度的函数。您可以在函数中使用一些逻辑来正确识别Visa长度。
这是一个检查长变量长度的函数。
int get_long_len(long value)
{
int l = 1;
while (value > 9)
{
l++;
value /= 10;
}
return l;
}
它接受long值并返回长度。