CS50 学分:总是变得无效 return

CS50 Credit: Always getting INVALID return

正在尝试从 CS50 获得积分,但我的代码一直收到无效 return。我通过使用数组来解决这个问题,尽管它可能不是最好的方法。代码编译没有问题。

我的伪代码逻辑是:

1) 获取卡号

2) 使用循环查找位数

3) 检查卡片是否包含 13、15 或 16 位数字

4) 如果是,将long中的数字写入数组

5) 有一个原始数组的副本,每隔一个数字乘以 2

6) 加乘积的位数

7) 检查卡片长度和起始数字

这是我的代码:

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

int main(void)
{
    // Get credit card number
    long num = get_long("Number: ");

    // Find number of digits
    int digits = 0;
    while (num > 0)
    {
        num /= 10;
        digits++;
    }

    // Check if number of digits is within possible range
    if (digits != 13 && digits != 15 && digits != 16)
    {
       printf("INVALID\n");
    }

    int originalnumber[digits];

    // Write each digit of credit card number into an array
    for (int i = digits - 1; i >= 0; i--)
    {
        originalnumber[i] = num % 10;
        num = num / 10;
    }

    // Multiply alternate digits by 2
    int number[digits];
    for (int i = 0; i < digits; i++)
    {
        number[i] = originalnumber[i];
    }

    for (int i = 1; i < digits; i+=2)
    {
        number[i] = number[i] * 2;
    }

    // Add product digits
    int sum = 0;
    int temp;
    for (int i = 0; i < digits; i++)
    {
        temp = (number[i] % 10) + ((number[i] / 10) % 10);
        sum = sum + temp;
    }

    // Check for card length and starting digits

    // AMEX
    if (digits == 15)
    {
        if (originalnumber[14] == 3 && sum % 10 == 0 && (originalnumber[13] == 4 || originalnumber[13] == 7))
        {
            printf("AMEX\n");
            return 0;
        }
    }

    // MasterCard
    if (digits == 16)
    {
        if (originalnumber[15] == 5 && sum % 10 == 0 && (originalnumber[14] == 1 || originalnumber[14] == 2 || originalnumber[14] == 3 || originalnumber[14] == 4 || originalnumber[14] == 5))
        {
            printf("MASTERCARD\n");
            return 0;
        }
    }

    // Visa
    if (digits == 13)
    {
        if (originalnumber[12] == 4 && sum % 10 == 0)
        {
            printf("VISA\n");
            return 0;
        }
    }
    if (digits == 16)
    {
        if (originalnumber[15] == 4 && sum % 10 == 0)
        {
            printf("VISA\n");
            return 0;
        }
    }
    printf("INVALID\n");
    return 1;
}

我尝试了 debug50,似乎当我尝试使用 temp 和 sum 将数字加在一起时,循环完成时总和仍然为 0。我可以知道这里出了什么问题吗?我的伪代码流程是错误的还是我可能忽略了任何明显的错误? (盯着看太久了..)

提前致谢!

如果 sum 始终为 0,无论这是否如您所愿,sum % 10 将始终为 0,因此未通过测试的不是 "false"。

您应该注意 originalnumber

这个循环后 num 的值是多少?

 while (num > 0)
 {
     num /= 10;
     digits++;
 }