You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50 Credit项目代码本地运行正常但check50检测报错求助

CS50 Credit项目代码本地运行正常但check50检测报错求助

嘿,我看你在CS50 Credit项目里遇到了check50的检测问题——本地测试有效卡号没问题,但两个特定的无效卡号被误判成了AMEX和MASTERCARD,咱们来拆解下问题出在哪~

首先先明确你遇到的check50报错:

:( identifies 369421438430814 as INVALID (invalid identifying digits)
expected "INVALID\n", not "AMEX\n"

:( identifies 5673598276138003 as INVALID (invalid identifying digits)
expected "INVALID\n", not "MASTERCARD\n"

问题根源:卡种判断逻辑缺失关键条件

你的代码里,typeOfCard函数的卡种判断只检查了第一位数字和卡号长度,但忽略了各卡种要求的第二位数字范围:

  • AMEX要求卡号是15位,且必须以34或37开头(不是所有以3开头的15位卡号都是AMEX)
  • MASTERCARD要求卡号是16位,且必须以51-55之间的两位数字开头(不是所有以5开头的16位卡号都是MASTERCARD)

看那两个报错的测试用例:

  • 369421438430814是15位、第一位是3,但第二位是6,不符合AMEX的34/37前缀,本该是INVALID,却被你的代码误判为AMEX
  • 5673598276138003是16位、第一位是5,但第二位是6,不在MASTERCARD的1-5范围里,本该是INVALID,却被误判为MASTERCARD

修复方案:完善卡种判断的前缀条件

修改typeOfCard函数,增加对第二位数字的检查。这里可以先提取卡号的前两位数字,再结合长度判断:

int typeOfCard(long long creditCard)
{
    // 统计卡号长度
    long long creditCardCount = creditCard;
    int count = 0;
    while (creditCardCount > 0)
    {
        creditCardCount = creditCardCount / 10;
        count++;
    }

    // 获取前两位数字
    long long firstTwo = creditCard;
    while (firstTwo >= 100)
    {
        firstTwo /= 10;
    }
    int firstDigit = firstTwo / 10;
    int secondDigit = firstTwo % 10;

    // MASTERCARD:16位,前缀51-55
    if (count == 16 && firstDigit == 5 && secondDigit >= 1 && secondDigit <= 5)
    {
        printf("MASTERCARD\n");
    }
    // AMEX:15位,前缀34或37
    else if (count == 15 && firstDigit == 3 && (secondDigit == 4 || secondDigit == 7))
    {
        printf("AMEX\n");
    }
    // VISA:13或16位,前缀4(第二位无限制)
    else if ((count == 13 || count == 16) && firstDigit == 4)
    {
        printf("VISA\n");
    }
    else
    {
        printf("INVALID\n");
    }
    return count;
}

额外小优化(不影响功能但更简洁)

你的validate_card函数里有个冗余的判断:

sum = sum + otherSum;
sum = sum % 10;
if (sum % 10 == 0)

可以简化为:

sum = (sum + otherSum) % 10;
if (sum == 0)

因为sum %10之后的结果范围是0-9,再取模10就是它本身,这样写更直观。

修改之后再跑check50,应该就能通过那两个测试用例了~

备注:内容来源于stack exchange,提问作者Jonathan Wolfman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 08:08:12