CS50 问题集 1 Credit - 找不到逻辑错误

CS50 Problem set 1 Credit - can't find the logic error

当我输入应该有效的信用卡号时,它会输出 "INVALID" 当它应该输出信用卡品牌时。我相信有效性功能出了问题,但我似乎无法弄清楚是什么。我花了几个小时试图解决这个问题,但没有任何效果。如果我能得到一些帮助,那就太好了,非常感谢!

这是我的代码:

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

bool validity(long long creditNum);
int find_length(long long n);
bool checksum(long long ccn);
void credit_card_num(long long ccn);

int main(void)
{
    long long creditNum;
    do
    {
    creditNum = get_long_long("Enter Card Number: ");
    }
    while(creditNum < 0);

    if (validity(creditNum) == true)
        credit_card_num(creditNum);
    else
        printf("INVALID\n");
}

bool validity(long long creditNum)
{
    int length = find_length(creditNum);
    if ((length == 13 || length == 15 || length == 16) && checksum(creditNum))
       return true;
    else
       return false;  
}

int find_length(long long n)
{
    int length;
    for (length = 0; n != 0; n/= 10)
    length++;
    return length;
}

bool checksum(long long ccn)
{
    int sum = 0;
    int digit;
    for (int i = 0; ccn != 0; i++, ccn /= 10)
    {
        if (i % 2 == 0)
           sum += ccn % 10;
        else
        digit = 2 * (ccn % 10);
        sum += digit / 10 + digit % 10;
    }
    if ((sum % 10) == 0)
       return true;
    else
       return false;
}

void credit_card_num(long long ccn)
{
    if ((ccn >= 34e13 && ccn < 35e13) || (ccn >= 37e13 && ccn < 38e13))
        printf("AMEX\n");
    else if (ccn >= 51e14 && ccn < 56e14)
        printf("MASTERCARD\n");
    else if ((ccn >= 4e12 && ccn < 5e12) || (ccn >= 4e15 && ccn < 5e15))
        printf("VISA\n");
    else
        printf("INVALID\n");
}

首先,如果您包含 "get_long_long" 函数就好了,这样我们就可以看到输入是如何进行的。 其次,checksum 函数中的digit 变量没有初始化,这导致了一些问题。 最后,简单看一下 here,你有点用错误的方式实现了算法,我修正了它,请检查结果是否适合你:

bool checksum(long long ccn)
{
    int sum = 0;
    int digit;
    for (int i = 0; ccn != 0; i++, ccn /= 10)
    {
        digit = ccn % 10;

        if (i % 2 != 0) {
            digit *= 2;
            if (digit > 9)
                digit -= 9;
        }

        sum += digit;   
    }

    if ((sum % 10) == 0)
        return true;
    else
        return false;
}

看起来你的错误是在你的校验和函数中;具体来说,for 循环。

for (int i = 0; ccn != 0; i++, ccn /= 10)
{
    if (i % 2 == 0)
       sum += ccn % 10;
    else
    digit = 2 * (ccn % 10);
    sum += digit / 10 + digit % 10;
}

应该是

for (int i = 0; ccn != 0; i++, ccn /= 10)
{
    if (i % 2 == 0){
       sum += ccn % 10;
    } else {
       digit = 2 * (ccn % 10);
       sum += digit / 10 + digit % 10;
    }
}

您的 if-else 语句周围嵌套不正确。我测试了几个数字,他们打印了正确的输出。