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;
}
在这段 C++ 代码中,我是按照教程编写的,但是我没有明白他解释的所有内容。比如他为什么要把cardNumber变量的大小减去2,比如将16变成14有什么意义?为什么他用 48 减去cardNumber[i]?
我把视频看了好几遍,但还是没明白。
这是完整的代码:
#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;
}
代码中发生的事情是我们使用 Luhn 算法来检查信用卡是否有效。
顺便说一句,我是初学者,提前谢谢。
回答您的问题:
cardNumber[i] - 48
部分,它是一个 ascii 转换。诚然,这是一种从字符串中获取 int 的奇怪方法。最易读的方法可能是使用 stoi()
函数。话虽如此,这个实现确实有效。如果您查看 ascii 表,您会发现数字 0
作为字符串在 ASCII 中表示为 48。因此,以 '7'
作为字符串为例。在 ascii 中,7 等于 55。如果从中减去 48,您将得到 7 作为整数。sumEvenDigits()
函数中,他从长度中减去 2。这是正确的,实际上可能是最好的方法。如果您查看维基百科上的算法,您会发现您想要减去校验位。这相当于从长度中减去 1。在本例中,从长度中减去 2,因为您想要检查偶数位,而第一位数字是奇数位,因此您将忽略它。如果您查看 sumOddDigits()
函数,您会发现从长度中减去 1 也用于减去校验位。