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

求助检查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;
}

关键修改点

  1. 替换校验和计算循环:用while循环替代原for循环,确保遍历所有卡号位数,同时完成校验和计算与位数统计,避免重复代码。
  2. 修正偶数位判断逻辑:原代码错误定位了需要加倍的位数,现在用count%2==1(count从0开始计数)来正确对应Luhn算法要求的从右数的偶数位。
  3. 移除错误的VISA长度判断:CS50作业中VISA的有效卡号长度是13或16位,不需要考虑19位。
  4. 简化代码结构:把卡号长度校验从else块中提前,逻辑更清晰直观。

内容的提问来源于stack exchange,提问作者sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:53:19