我不明白这个C++代码是如何做它的事情的? [重复]

问题描述 投票:0回答:1
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 算法来检查信用卡是否有效。

顺便说一句,我是初学者,提前谢谢。

c++
1个回答
0
投票

回答您的问题:

  • @wohlstad 很好地解释了
    cardNumber[i] - 48
    部分,它是一个 ascii 转换。诚然,这是一种从字符串中获取 int 的奇怪方法。最易读的方法可能是使用
    stoi()
    函数。话虽如此,这个实现确实有效。如果您查看 ascii 表,您会发现数字
    0
    作为字符串在 ASCII 中表示为 48。因此,以
    '7'
    作为字符串为例。在 ascii 中,7 等于 55。如果从中减去 48,您将得到 7 作为整数。
  • 在你的
    sumEvenDigits()
    函数中,他从长度中减去 2。这是正确的,实际上可能是最好的方法。如果您查看维基百科上的算法,您会发现您想要减去校验位。这相当于从长度中减去 1。在本例中,从长度中减去 2,因为您想要检查偶数位,而第一位数字是奇数位,因此您将忽略它。如果您查看
    sumOddDigits()
    函数,您会发现从长度中减去 1 也用于减去校验位。
© www.soinside.com 2019 - 2024. All rights reserved.