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
相关产品推荐
相关产品推荐

