用C语言实现Luhn算法时,每隔一位数字求和结果不符合预期
Luhn算法相关计算问题排查与修复
问题原因分析
你得到36而非预期的22,核心问题大概率是两个:
- 处理范围错误:你可能误将所有数字位都做了乘2处理,而非仅针对目标隔位数字(你要处理的是2、4、6、8这四个数)。额外处理1、3、5、7、9这些不需要乘2的位,直接拉高了总和。
- 遍历/循环逻辑错误:要么处理顺序搞反(比如从右往左处理了错误的位),要么循环终止条件没控制好,导致多处理无效位或漏选目标位。
修复后的代码示例(匹配你的预期需求)
下面的代码专门处理你指定的隔位数字(从左数第2、4、6、8位),计算它们乘2拆分后的累加和:
#include <stdio.h> void calculateTargetSum(long long num) { int digits[20]; int digitCount = 0; int sum = 0; long long tempNum = num; // 把数字拆解成单个数字,先存成从右到左的顺序 while (tempNum > 0) { digits[digitCount++] = tempNum % 10; tempNum /= 10; } // 反转数组,得到从左到右的数字顺序(1,2,3,4,5,6,7,8,9) for (int i = 0; i < digitCount / 2; i++) { int temp = digits[i]; digits[i] = digits[digitCount - 1 - i]; digits[digitCount - 1 - i] = temp; } // 遍历处理从左数的偶数位(索引1、3、5、7,对应原数的2、4、6、8) for (int i = 1; i < digitCount; i += 2) { int doubled = digits[i] * 2; // 拆分大于10的乘积,比如16→1+6 if (doubled > 9) { doubled = (doubled / 10) + (doubled % 10); } sum += doubled; } printf("计算结果:%d\n", sum); } int main() { calculateTargetSum(123456789); return 0; }
关键逻辑说明
- 先拆分数字为数组并反转,确保能从左到准确定位目标位;
- 用
i += 2跳过不需要处理的位,只聚焦指定的隔位数字; - 循环终止条件
i < digitCount保证不会超出数字有效位数,避免无效计算; - 乘积拆分用
(doubled /10)+(doubled%10)直接实现,逻辑清晰直观。
运行这段代码,输入123456789会得到预期的22。
内容的提问来源于stack exchange,提问作者Shah
相关产品推荐
相关产品推荐

