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

CS50作业:C语言实现卢恩算法时如何累加乘积的各位数字

解决卢恩算法中隔位乘2后累加各位数字的问题

Hey Bryce, 我看到你在CS50的信用卡验证作业里卡在卢恩算法的核心步骤了,别担心,咱们一步步来搞定这个问题。

首先得指出你当前代码里的小问题:你写的multiply_digits = (second_to_last_number*2)+(fourth_number*2)+...这一步,直接把乘2后的乘积加在了一起——但卢恩算法要求的是累加乘积的各位数字(比如12要拆成1+2=3,而不是直接加12),这是你当前逻辑的关键漏洞。

第一步:写个辅助函数计算数字的各位和

我们可以先实现一个简单的小函数,用来计算任意整数的各位数字之和,这样处理乘2后的数字就很方便了:

// 计算一个数的各位数字之和
int sum_digits(int num) {
    int sum = 0;
    while (num > 0) {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}

第二步:修正乘2数字的累加逻辑

用上面的函数替换你原来的直接相加逻辑,处理所有需要乘2的数字:

// 计算需要乘2的数字的各位和总和
int multiply_sum = sum_digits(second_to_last_number * 2) + 
                   sum_digits(fourth_number * 2) + 
                   sum_digits(sixth_number * 2) + 
                   sum_digits(eighth_number * 2) + 
                   sum_digits(tenth_number * 2) + 
                   sum_digits(twelfth_number * 2) + 
                   sum_digits(fourteenth_number * 2) + 
                   sum_digits(sixteenth_number * 2);

第三步:计算未乘2数字的总和

接下来把那些不需要乘2的数字(从最后一位开始的奇数位)加起来:

// 计算未乘2的数字总和
int non_multiply_sum = last_number + third_number + fifth_number + 
                       seventh_number + ninth_number + eleventh_number + 
                       thirteenth_number + fifteenth_number;

第四步:完成卢恩校验

把两个总和相加,判断结果的最后一位是否为0:

int total = multiply_sum + non_multiply_sum;
if (total % 10 == 0) {
    // 卡号通过卢恩校验,接下来可以判断卡组织(Amex/MasterCard/Visa)
    printf("Valid!\n");
} else {
    printf("Invalid!\n");
}

额外建议:用循环简化代码

我注意到你现在用了大量变量逐个提取卡号数字,其实可以用循环来简化这个过程,不管卡号是13、15还是16位都能适配,还能避免重复代码:

long temp = credit_card_number;
int multiply_sum = 0;
int non_multiply_sum = 0;
int digit_position = 0; // 记录当前处理的是第几位(从最后一位开始数)

while (temp > 0) {
    int current_digit = temp % 10;
    digit_position++;
    
    // 从倒数第二位开始,每隔一位乘2(也就是第2、4、6...位)
    if (digit_position % 2 == 0) {
        multiply_sum += sum_digits(current_digit * 2);
    } else {
        non_multiply_sum += current_digit;
    }
    
    temp /= 10;
}

int total = multiply_sum + non_multiply_sum;

记得在代码开头声明sum_digits函数,或者把它放在main函数之前哦。把这些逻辑整合到你的代码里,就能完成卢恩算法的核心校验了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:37:51