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

如何用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;
}

代码逻辑说明

  1. double_digit_sum函数:专门处理Luhn算法中"乘2后拆分求和"的规则——输入单个数字,乘2后若大于9则拆分十位与个位相加,否则直接返回乘2结果。
  2. check_sum函数:
    • 第一个循环遍历需要乘2的位(从右数第2位开始,每次跳两位),调用辅助函数计算后累加到总和
    • 第二个循环遍历不需要乘2的位(从右数第1位开始,每次跳两位),直接将数字累加到总和
    • 最终返回完整求和结果,后续可通过总和 % 10 == 0判断卡号是否符合Luhn规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:57:17