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

关于Luhn算法信用卡验证C++代码的两处疑问求解

Luhn算法信用卡验证代码疑问解答

问题1:sumEvenDigits函数中循环起始值为何设为cardNumber.size() - 2?

这是完全贴合Luhn算法的规则:
Luhn算法要求从卡号的倒数第二位开始(跳过最后一位的校验位),从右往左每隔一位将数字乘2,再把这些数的各位相加。

而字符串的索引是从左到右从0开始计数的:

  • cardNumber.size() - 1 对应卡号的最后一位(校验位,由sumOddDigits处理)
  • cardNumber.size() - 2 正好对应卡号的倒数第二位,也就是我们需要开始处理的第一个位置。
    循环中每次i -= 2,就能依次取到倒数第二位、倒数第四位……直到最左边的符合要求的数字,完美匹配算法的遍历顺序。

问题2:代码中为何要执行cardNumber[i] - 48的操作?

因为cardNumber是std::string类型,存储的是字符形式的数字,每个字符对应的是ASCII码值:

  • 字符'0'的ASCII码是48,'1'是49,'2'是50……以此类推。

用字符减去48,就能把字符形式的数字转换成对应的整数数值,比如'7' - 48 = 7,这样才能对数字进行乘法、求和等数学运算。如果直接用字符的ASCII码计算,结果会完全错误。


完整代码

#include <iostream> 

int getDigit(const int number);
int sumEvenDigits(const std::string cardNumber);
int sumOddDigits(const std::string cardNumber);

int main(){
    std::string cardNumber;
    int result = 0;

    std::cout << "Please enter your Credit Card: ";
    std::cin >> cardNumber;

    std::cout << cardNumber.size();

    result = sumEvenDigits(cardNumber) + sumOddDigits(cardNumber);

    if (result % 10 == 0){
        std::cout << "Card is valid!";
    } else{
        std::cout << "Card is invalid!";
    }

    return 0;
}

int getDigit(const int number){
    return number % 10 + (number / 10 % 10);
}

int sumEvenDigits(const std::string cardNumber){
    int sum = 0;
    for(int i = cardNumber.size() - 2; i >= 0; i = i - 2){
        sum = sum + getDigit((cardNumber[i] - 48) * 2);
    }
    return sum;
}

int sumOddDigits(const std::string cardNumber){
    int sum = 0;
    for(int i = cardNumber.size() - 1; i >= 0; i = i - 2){
        sum = sum + cardNumber[i] - 48;
    }
    return sum;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:13:14