如何用C语言实现Luhn算法中的相乘数字求和?现有代码输出异常
修复Luhn算法中相乘后数字求和的问题
原代码核心问题
get_digit是局部计算,没有返回累加值,反而错误打印中间变量,无法累计总和check_sum只遍历了需要乘2的位,完全忽略了不需要乘2的位,且最终没有返回求和结果get_digit内部循环逻辑混乱,打印的不是正确的拆分数字,而是未完成累加的sum
修正后的代码实现
#include <stdbool.h> #include <stdio.h> // 计算单个数字乘2后的各位之和 int double_digit_sum(int digit) { int doubled = digit * 2; return doubled > 9 ? (doubled % 10) + (doubled / 10) : doubled; } long check_sum(long credit_num, int creditLength) { long sum = 0; long temp = credit_num; // 处理从右数第2、4、6...位(需要乘2的位) for (int i = 1; i < creditLength; i += 2) { int digit = (temp / 10) % 10; sum += double_digit_sum(digit); temp /= 100; } // 重置temp,处理从右数第1、3、5...位(不需要乘2的位) temp = credit_num; for (int i = 0; i < creditLength; i += 2) { int digit = temp % 10; sum += digit; temp /= 100; } return sum; } // 测试示例 int main() { long num = 4111111111111111; // 有效Visa卡号 int length = 16; long total = check_sum(num, length); printf("总和: %ld\n", total); printf("是否有效: %s\n", total % 10 == 0 ? "是" : "否"); return 0; }
代码逻辑说明
double_digit_sum函数:专门处理Luhn算法中"乘2后拆分求和"的规则——输入单个数字,乘2后若大于9则拆分十位与个位相加,否则直接返回乘2结果。check_sum函数:- 第一个循环遍历需要乘2的位(从右数第2位开始,每次跳两位),调用辅助函数计算后累加到总和
- 第二个循环遍历不需要乘2的位(从右数第1位开始,每次跳两位),直接将数字累加到总和
- 最终返回完整求和结果,后续可通过
总和 % 10 == 0判断卡号是否符合Luhn规则
内容的提问来源于stack exchange,提问作者imbored
相关产品推荐
相关产品推荐

