CS50作业实现Luhn算法遇异常:测试结果不符求代码排查
排查CS50 Luhn算法13位卡号处理的错误
首先澄清一个误解:你看到的1332其实是卡号位数(13)和部分求和结果(32)的连续输出——你的代码里printf("%i", count);没有添加换行符,导致后面的sum输出直接拼接在位数结果后,实际sum的计算值是32,并非1332。
你的代码核心问题有两个:
- 只完成了Luhn算法的一半步骤:Luhn算法要求将两类位的和相加:从右往左数的偶数位(乘以2后拆分求和)、奇数位(直接相加)。你的代码仅错误地处理了奇数位(把本该直接加的奇数位全部乘以2),完全漏掉了偶数位的直接求和。
- 循环逻辑冗余且定位错误:嵌套while循环定位数字位的方式低效且易出错,还导致你错误选中了本该直接相加的奇数位进行乘2操作。
修正后的代码示例
#include <cs50.h> #include <stdio.h> int main(void) { long num = get_long("What's your card number: "); long countNum = num; int count = 0; while (countNum != 0) { countNum /= 10; count++; } printf("卡号位数:%i\n", count); // 添加换行避免输出混淆 int sum = 0; long tempNum = num; int position = 1; // 从右往左数的位置,从1开始计数 if (count == 13) { while (tempNum != 0) { int digit = tempNum % 10; if (position % 2 == 0) { // 处理偶数位:乘2后拆分求和 int doubled = digit * 2; sum += (doubled / 10) + (doubled % 10); } else { // 处理奇数位:直接相加 sum += digit; } tempNum /= 10; position++; } printf("Luhn总和:%i\n", sum); if (sum % 10 == 0) { printf("卡号有效\n"); } else { printf("卡号无效\n"); } } }
修正说明
- 用
position变量跟踪从右往左的位数,避免嵌套循环的冗余逻辑 - 明确区分偶数位和奇数位的处理规则,完全符合Luhn算法要求
- 添加换行符拆分输出结果,解决你之前看到的拼接混淆问题
- 新增最终校验步骤,判断卡号是否符合Luhn规则
测试卡号4222222222222时,正确计算结果为40,能被10整除,输出"卡号有效",符合预期。
内容的提问来源于stack exchange,提问作者Colin Benaissa
相关产品推荐
相关产品推荐

