我正在研究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");
            }

        }
    }

最佳答案

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

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

10-06 01:43