关于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
相关产品推荐
相关产品推荐

