Как проверить номера кредитных карт с помощью алгоритма Луна в C

  • Проверка кредитной карты является важной частью электронной коммерции и онлайн-транзакций. Чтобы предотвратить мошенничество и обеспечить безопасность транзакций, важно убедиться, что номер кредитной карты, введенный пользователем, действителен. В этой статье мы рассмотрим, как проверять номера кредитных карт с помощью алгоритма Луна на C.

Что такое Алгоритм Луна?

Алгоритм Луна, также известный как алгоритм «модуль 10», представляет собой простую формулу контрольной суммы, используемую для проверки различных идентификационных номеров, включая номера кредитных карт. Алгоритм работает путем суммирования цифр числа, начиная с самой правой цифры и двигаясь влево. Если сумма делится на 10, то число считается действительным.

Как это работает?

  1. Умножьте каждую вторую цифру на 2, начиная со предпоследней цифры номера, а затем сложите цифры этих продуктов вместе.
  2. Прибавьте сумму к сумме цифр, которые не умножались на 2.
  3. Если последняя цифра суммы равна 0 (или, выражаясь более формально, если сумма по модулю 10 сравнима с 0), число верно!

Пример;

For the sake of discussion, let’s first underline every other digit, starting with the number’s second-to-last digit:

4003600000000014

Okay, let’s multiply each of the underlined digits by 2:

1•2 + 0•2 + 0•2 + 0•2 + 0•2 + 6•2 + 0•2 + 4•2

That gives us:

2 + 0 + 0 + 0 + 0 + 12 + 0 + 8

Now let’s add those products’ digits (i.e., not the products themselves) together:

2 + 0 + 0 + 0 + 0 + 1 + 2 + 0 + 8 = 13

Now let’s add that sum (13) to the sum of the digits that weren’t multiplied by 2 (starting from the end):

13 + 4 + 0 + 0 + 0 + 0 + 0 + 3 + 0 = 20

Yup, the last digit in that sum (20) is a 0, so David’s card is legit!

So, validating credit card numbers isn’t hard, but it does get a bit tedious by hand. Let’s write a program.

Код
Давайте взглянем на код для проверки номеров кредитных карт с использованием алгоритма Луна на C:

псевдокод:

1. Prompt the user to enter a credit card number
2. Read the credit card number from the user
3. Check if the credit card number is valid (greater than 0)
4. If the credit card number is not valid, go back to step 1
5. Extract the first few digits of the credit card number to determine the type of card
6. Initialize a variable to store the sum of the digits
7. While the credit card number is greater than 0:
   a. Get the last digit of the credit card number using the modulus operator
   b. Remove the last digit from the credit card number using integer division
   c. Increment a counter to keep track of the number of digits
   d. If the current digit is even (based on the counter):
      i. Double the digit
      ii. If the result is greater than 9, subtract 9 from it
   e. Add the current digit (or the doubled digit) to the sum
8. Check if the sum is divisible by 10
9. If the sum is divisible by 10:
   a. Check the first few digits of the credit card number to determine the type of card
   b. Print the name of the card (AMEX, MASTERCARD, VISA) or "INVALID"
10. If the sum is not divisible by 10, print "INVALID"
11. Terminate the program

Действительный код:

#include <stdio.h>
#include <math.h>

int main()
{
    long int cc;
    int digit_count = 0;
    int sum = 0;

    //asks user for input of card number
    do
    {
        printf("Enter card number: ");
        scanf("%ld", &cc);
    }
    while (cc < 1);

    //variables that store the first numbers of the cards
    int amex = cc / pow(10, 13);
    int master = cc / pow(10, 14);
    int visa[2];
    visa[0] = cc / pow(10, 12);
    visa[1] = cc / pow(10, 15);

    //checksum for the luhn algorithm
    while (cc > 0)
    {
        int digit = cc % 10;
        cc /= 10;
        digit_count++;

        if (digit_count % 2 == 0)
        {
            digit *= 2;
            if (digit > 9)
            {
                digit -= 9;
            }
        }

        sum += digit;
    }

    //statements to check if cards are valid,american express, visa, mastercard or invalid
    //if the result of sum ends with 0 then this is a valid card from there we check the type of card it is
    if (sum % 10 == 0)
    {
        if (amex == 34 || amex == 37)
        {
            printf("AMEX\n");
        }
        else if (master == 51 || master == 52 || master == 53 || master == 54 || master == 55)
        {
            printf("MASTERCARD\n");
        }
        else if (visa[0] == 4 || visa[1] == 4)
        {
            printf("VISA\n");
        }
        else
        {
            printf("INVALID\n");
        }
    }
    else
    {
        printf("INVALID\n");
    }

    //terminate the program
    return 0;
}
  • Код начинается с запроса пользователю ввести номер кредитной карты. Затем он использует цикл do-while, чтобы убедиться, что пользователь вводит положительное число.
  • Затем код извлекает первые несколько цифр номера кредитной карты, чтобы определить тип карты. Например, карты American Express обычно начинаются с цифр 34 или 37, поэтому код делит номер кредитной карты на 10¹³ и сохраняет результат в переменной Amex. Точно так же карты Mastercard обычно начинаются с цифр 51, 52, 53, 54 или 55, поэтому код делит номер кредитной карты на 10¹⁴ и сохраняет результат в основной переменной. Карты Visa могут начинаться с цифры 4, поэтому код делит номер кредитной карты на 10¹² и 10¹⁵ и сохраняет результаты в массиве Visa.
  • Затем код применяет алгоритм Луна к номеру кредитной карты для вычисления контрольной суммы. Алгоритм работает, перебирая цифры числа, начиная с самой правой цифры и двигаясь влево. Если текущая цифра четная, код удваивает ее и вычитает 9, если результат больше 9. Затем код добавляет текущую цифру (или удвоенную цифру) к текущей сумме.
  • Наконец, код проверяет, верна ли контрольная сумма, проверяя, делится ли сумма на 10. Если контрольная сумма верна, код проверяет первые несколько цифр номера кредитной карты, чтобы определить тип карты. Если карта является действительной картой American Express, Mastercard или Visa, код печатает название карты. В противном случае код печатает «INVALID».

Заключение.
В этой статье мы рассмотрели, как проверять номера кредитных карт с помощью алгоритма Луна на языке C. Мы увидели, как работает этот алгоритм и как реализовать его в коде. использование циклов, условных выражений и массивов. Мы также обсудили, как извлечь первые несколько цифр номера кредитной карты, чтобы определить тип карты. Следуя этим шагам, вы можете гарантировать, что ваша электронная коммерция и онлайн-транзакции безопасны и свободны от мошенничества.