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

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");
        }
    }
}

修正说明

  1. 用position变量跟踪从右往左的位数,避免嵌套循环的冗余逻辑
  2. 明确区分偶数位和奇数位的处理规则,完全符合Luhn算法要求
  3. 添加换行符拆分输出结果,解决你之前看到的拼接混淆问题
  4. 新增最终校验步骤,判断卡号是否符合Luhn规则

测试卡号4222222222222时,正确计算结果为40,能被10整除,输出"卡号有效",符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:00:54