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

用C语言实现Luhn算法时,每隔一位数字求和结果不符合预期

Luhn算法相关计算问题排查与修复

问题原因分析

你得到36而非预期的22,核心问题大概率是两个:

  1. 处理范围错误:你可能误将所有数字位都做了乘2处理,而非仅针对目标隔位数字(你要处理的是2、4、6、8这四个数)。额外处理1、3、5、7、9这些不需要乘2的位,直接拉高了总和。
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:55:21