信用卡号码验证

时间:2019-05-18 15:34:57

标签: c validation credit-card luhn

我正在研究CS50的信用问题。但是,无论我输入什么卡号,我都只会打印INVALID。请问代码有什么问题?计算总和的部分似乎有问题。

    #include <cs50.h>
    #include <stdio.h>
    #include <math.h>

    int main(void)
    {
        // Get the card number
        long num;
        do 
        {
            num = get_long("What is the card number?\n");
        } while (num < 0);

        long sum = 0, sum2 = 0, count = 0;
        //Get the sum
        for (long i = num; i > 0; i = i / 10)
        {
            sum += i % 10;
            count++;
        }
        for (long i = num / 10; i > 0; i = i / 100)
        {
            sum2 += i % 10;    
        }

        if ((sum + sum2) % 10 != 0) 
        {
            printf("INVALID");
        }
        else 
        {
            long digits = num / (10 * (count - 2));
            if (count == 15 && 
               (digits == 34 || digits == 37)) 
            {
                printf("AMERICAN EXPRESS");
            } 
            else if (count == 16 && 51 <= digits <=55)
            {
                printf("MASTERCARD");
            }
            else if ((count == 16 || count == 13) && (digits / 10) == 4)
            {
                printf("VISA");               
            }
            else 
            {
                printf("INVALID");
            }

        }
    }

1 个答案:

答案 0 :(得分:1)

这给出了每个位数的总和。

for (long i = num; i > 0; i = i / 10)
        {
            sum += i % 10;
            count++;
        }

再次查看问题集,特别是有关Luhn算法的讨论。有两个总和,但是它们是“互斥的”。如果将数字添加到sum1,则不会将其添加到sum2。反之亦然。代码中的任何地方都明显缺少*2(时间2)。

也许您会发现此walkthrough video有用。请注意:它来自课程的早期版本,并提到了功能get_long_long。已经退休了,像在这里一样使用get_long