CS50课程中不使用数组实现Luhn算法的C语言代码无输出问题求助
问题排查与修复方案
你的程序没有输出的直接原因是陷入了无限循环,同时代码里还有好几处变量初始化和语法错误,我来一步步帮你梳理:
1. 最致命的问题:无限循环导致程序卡住
看这段代码:
while ( n > 10); n = n/10;
这里的while后面多了一个分号;,这意味着循环体是空的——程序会一直检查n > 10这个条件,而n因为下面的n = n/10永远不会被执行(它不在循环体内)。更糟的是,n之前还没有被正确初始化,是随机的垃圾值,几乎肯定满足n > 10,所以程序会一直卡在这里,永远到不了后面的输出逻辑。
2. 变量初始化错误:覆盖了用户输入的卡号
在第一个循环前,你写了:
num = n;
但此时n还没有被赋值(你只声明了long long num, n;,但没给n赋值),这会把一个随机的垃圾值赋值给num,直接覆盖了用户刚输入的信用卡号码,导致后续的Luhn算法计算完全基于无效数据。
你应该把n初始化为用户输入的原始卡号,比如在scanf之后加:
n = num; // 保存原始卡号,后面用来判断卡品牌
3. 语法错误:AMEX判断后的多余分号
这段代码:
else if (n==3); printf("AMEX");
else if后面的分号让条件判断和printf断开了,不管n是不是等于3,printf("AMEX");都会执行。你需要去掉这个分号。
4. 卡品牌判断逻辑错误
- AMEX的开头是34或37,不是单纯的3;
- VISA是4开头,但你当前的
n处理逻辑(试图取开头数字)是错的,因为你之前的n没有被正确处理。正确的做法是从原始卡号n中不断除以10,直到它变成两位数(判断AMEX)或者一位数(判断VISA); - 另外,你还需要考虑卡号的长度,比如VISA是13或16位,AMEX是15位,这也是判断的一部分。
5. Luhn算法的循环终止条件错误
第一个循环的while (num >10)会漏掉最后一位数,应该改成while (num > 0),这样才能处理所有数字。
修复后的示例代码
我把这些问题都修正了,你可以参考:
#include <stdio.h> int main() { long long num, original_num; int sum = 0, temp; int digit_count = 0; // 用来统计卡号位数 printf("please enter your credit card number\n"); scanf("%lld", &num); original_num = num; // 保存原始卡号 // 统计卡号位数 long long temp_count = original_num; while (temp_count > 0) { digit_count++; temp_count /= 10; } // Luhn算法计算 int is_second = 0; // 标记是否是从右数第二位的数字 while (num > 0) { temp = num % 10; if (is_second) { temp *= 2; if (temp > 9) { temp -= 9; } } sum += temp; num /= 10; is_second = !is_second; // 切换标记 } // 判断卡品牌 if (sum % 10 == 0) { // 获取开头的1或2位数字 long long start = original_num; while (start >= 100) { start /= 10; } if ((start == 34 || start == 37) && digit_count == 15) { printf("AMEX\n"); } else if ((start / 10 == 4) && (digit_count == 13 || digit_count == 16)) { printf("VISA\n"); } else { printf("INVALID\n"); } } else { printf("INVALID\n"); } return 0; }
总结
程序无输出的核心原因是第二个while循环后的多余分号导致无限循环,加上n未初始化的问题,让程序根本走不到输出步骤。先修复这两个问题,再调整逻辑错误,就能正常运行了。
内容的提问来源于stack exchange,提问作者haaland
相关产品推荐
相关产品推荐

