求助检查Luhn算法C语言代码的校验错误(CS50课程作业)
CS50第一周信用卡校验代码修复方案
问题根源
你的代码错误识别无效卡号的核心原因是Luhn校验和的计算逻辑完全没执行:
- 初始化
count=0后,for循环的条件i <= count等价于i <=0,循环体根本不会运行,sum始终为0。 - 因为
sum%10 ==0恒成立,所以直接跳过了校验和无效的判断,进入卡组织识别环节,导致两个无效卡号被错误归类为VISA。
修复后的代码
#include <stdio.h> #include <cs50.h> int main(void) { long long card_num = 0LL; do { card_num = get_long_long("Number: "); } while (card_num < 1LL || card_num > 9999999999999999LL); int sum = 0; long long temp_num = card_num; int count = 0; // 用while循环遍历所有卡号位数,同时计算校验和与位数 while (temp_num > 0LL) { int digit = temp_num % 10LL; // 定位从右数的偶数位(倒数第二位、第四位...) if (count % 2 == 1) { digit *= 2; if (digit > 9) { digit -= 9; } } sum += digit; temp_num /= 10LL; count++; } if (sum % 10 != 0) { printf("INVALID\n"); return 0; } // 校验卡号长度是否合法 if (count != 13 && count != 15 && count != 16) { printf("INVALID\n"); return 0; } // 获取卡组织标识(前1或2位) temp_num = card_num; while (temp_num > 100LL) { temp_num = temp_num / 10LL; } int company_id = temp_num; if (company_id > 50 && company_id < 56 && count == 16) { printf("MASTERCARD\n") ; } else if ((company_id == 34 || company_id == 37) && count == 15) { printf("AMEX\n") ; } else if ((company_id / 10 == 4) && (count == 13 || count == 16)) { // CS50作业中VISA有效长度为13/16位,移除错误的19位判断 printf("VISA\n") ; } else { printf("INVALID\n"); } return 0; }
关键修改点
- 替换校验和计算循环:用while循环替代原for循环,确保遍历所有卡号位数,同时完成校验和计算与位数统计,避免重复代码。
- 修正偶数位判断逻辑:原代码错误定位了需要加倍的位数,现在用
count%2==1(count从0开始计数)来正确对应Luhn算法要求的从右数的偶数位。 - 移除错误的VISA长度判断:CS50作业中VISA的有效卡号长度是13或16位,不需要考虑19位。
- 简化代码结构:把卡号长度校验从else块中提前,逻辑更清晰直观。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

