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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:48:10