Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我在卢恩的尝试';s算法(用于信用卡有效性)似乎可以识别一些卡,但不能识别其他卡_C_Cs50_Luhn - Fatal编程技术网

C 我在卢恩的尝试';s算法(用于信用卡有效性)似乎可以识别一些卡,但不能识别其他卡

C 我在卢恩的尝试';s算法(用于信用卡有效性)似乎可以识别一些卡,但不能识别其他卡,c,cs50,luhn,C,Cs50,Luhn,我已经构建了一些代码来模拟Luhn的算法来检查信用卡的有效性。它成功地识别了美国运通卡(15位数字,以34或37开头),但当我尝试万事达卡(16位数字,以51开头,52,53,54或55)时,它无法识别它们。Visa卡有13位或16位数字,以数字4开头,我的代码似乎能正确识别16位数字,但不能识别13位数字。我已经检查了我的代码并仔细检查了我的数字范围,但我似乎无法准确地诊断为什么有些卡可以通过,而其他卡不能。任何帮助都将不胜感激 编辑: 我几乎解决了这个问题,修改了它,现在所有的卡号都签出了,

我已经构建了一些代码来模拟Luhn的算法来检查信用卡的有效性。它成功地识别了美国运通卡(15位数字,以
34
37
开头),但当我尝试万事达卡(16位数字,以
51
开头,
52
53
54
55
)时,它无法识别它们。Visa卡有13位或16位数字,以数字
4
开头,我的代码似乎能正确识别16位数字,但不能识别13位数字。我已经检查了我的代码并仔细检查了我的数字范围,但我似乎无法准确地诊断为什么有些卡可以通过,而其他卡不能。任何帮助都将不胜感激

编辑:

我几乎解决了这个问题,修改了它,现在所有的卡号都签出了,但现在它将一个无效的号码(
4111111113
)识别为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("AMEX\n");
    }
    else
    if ((f == 0) && (number > 5099999999999999) && (number < 5600000000000000))
    {
        printf("MASTERCARD\n");
    }
    else
    if (((f == 0) && ((number > 3999999999999) && (number < 5000000000000))) || ((number > 3999999999999999) && (number < 5000000000000000)))
    {
        printf("VISA\n");
    }
    else
    {
        printf("INVALID\n");
    }
}
#包括
#包括
#包括
长数;
内部主(空)
{
长i=0;
长b;
长m=10;
长n=1;
数字=获取长(“数字?\n”);
做
{
长a=数量%m;
b=数字-a;
长c=b%(m*10);
长d=c/m;
长e=d*2;
if(e<9)
{
i=i+e;
}
其他的
{
i=i+(e-10+1);
}
{
m=m*100;
}
}
而(b>0);
做
{
长a=数字%n;
b=数字-a;
长c=b%(n*10);
长d=c/n;
长e=d;
if(e<9)
{
i=i+e;
}
其他的
{
i=i+(e-10+1);
}
{
n=n*100;
}
}
而(b>0);
int f=i%10;
如果((f==0)和(&(数字>339999999999)和(&(数字<35000000000000))| |((数字>369999999999)和(&(数字<38000000000000)))
{
printf(“美国运通”);
}
其他的
如果((f==0)和&(数字>5099999999999)和&(数字<5600000000000000))
{
printf(“万事达卡”);
}
其他的
如果((f==0)和((数字>39999999999)和((数字<5000000000000))和((数字>39999999999999)和((数字<5000000000000)))
{
printf(“VISA卡”);
}
其他的
{
printf(“无效\n”);
}
}

我发现您在验证某些卡的长度时遇到了问题。要解决此问题,请使用自动检查长链长度的函数。您可以在函数中使用一些逻辑来正确识别签证长度

下面是检查长变量长度的函数

int get_long_len(long value)
{
    int l = 1;
    while (value > 9)
    {
        l++;
        value /= 10;
    }
    return l;
}

它接受long值并返回长度。

我可能在这里遗漏了一些东西,但这是在哪里/怎么做到的?这只是每秒钟加倍一次?@EdmCoff我使用m和n作为模运算符的输入,每次迭代都会增加*100。有道理吗?谢谢。我确实错过了。为什么两个循环都是两位数?(我假设您的第二个循环不应将数字加倍)。还有,你确定可以从数字后面开始数第二位数吗?(例如,对于偶数的数字,比如123456,我想你想把2/4/6,而不是5/3/1加倍)@EdmCoff你的观察很准确-我不知道为什么我把数字加倍了两次。我改变了这一点,现在它可以识别所有的卡-但是,它仍然将一个无效的序列(4111111113)识别为Visa卡。我看到你已经纠正了倍增问题,但我没有看到从数字后面开始的帐户有任何改变。一开始我对你所说的“长的长度”感到困惑。从阅读中,我认为您的意思是“如果值以10为基数打印,则小数位数”。是吗?@jwd No在C中有一种叫做long的变量类型,它基本上是一个可以容纳更多数字的数字。一个整数只能升到a,我想大概在200-300万左右,而一个长变量可以让你分配更大的数字。本质上,我说的是“名为long的数字变量的长度”,因为信用卡号码非常长,最好将其分配给long,因为有时int可能不接受它。我知道类型是
long
,对于
int
,它通常是64位,而不是32位。但这些是二进制数。它们的“长度”是一个位数(至少在我看来)。但我想这里你说的是一个“长度”,好像它们被打印成“12345…”?是的,我说的是长度,因为像096这样的数字的长度是3。不是二进制数字,只是计算在IDE中用C看到的内容。