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,却被你的代码误判为AMEX5673598276138003是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
相关产品推荐
相关产品推荐

