MyTetra Share
Делитесь знаниями!
Алгоритм Луна (Luhn Algorithm)
Время создания: 30.07.2018 18:00
Текстовые метки: lunh algorithm
Раздел: Алгоритмы
Запись: Velonski/mytetra-database/master/base/15329556296thdxjtw4b/text.html на raw.githubusercontent.com

В функции ValidateCard применяется алгоритм, названный алгоритмом Луна, кото­рый разработал специалист компании IBM в 1960 гг. Алгоритм Луна действует, т. к. компании, выпускающие кредитные карты, следуют его правилам. Другими словами, они выпускают только такие номера, которые считаются допустимыми с точки зрения алгоритма Луна.


Полное объяснение алгоритма Луна можно найти на Web-странице http://en.wikipedia.org/wiki/Luhn_algorithm.Далее приведено описание его принципа действия в версии журнала "Reader's Digest".


1. Удвойте каждую вторую цифру номера кредитной карты, начиная с последней цифры номера. Оставьте все цифры с четным2 номером неизменными. Например, номер 1111 превратится вномер2121.


2. Если в процессе удвоения получается число большее 9, сложите две цифры полученного результата вместе и поставьте их на место исходной цифры. Например, номер 1166 превратится в номер 2136. Вторая от конца цифра 6 была удвоена (до 12) и цифры результата (1 и 2) сложили вместе (для получения 3).


3. Сложите все цифры получившегося номера вместе. Если у вас в данный момент номер 2136, сложите вместе 2+1+3+6 (что даст 12).


4. Если результат заканчивается 0 (или иначе, если он кратен 10), номер карты допустимый. В противном случае — нет.


Алгоритм Луна проверяет, может ли предоставленный вами номер быть номером реаль­ной кредитной карты. Но он делает только то, что делает. Этот алгоритм не может обна­ружить номер кредитной карты, технически приемлемый, но на самом деле не присво­енный никакому банковскому счету (и ясно, что не может определить финансовое положение владельца счета и наличие на счету требуемого для покупки лимита).


Далее приведен полный программный код функции ValidateCard. Все строки кода пронумерованы, поэтому вы можете разбить его на элементарные порции (построчные объ­яснения даются после кода):


1 Function ValidateCard(CardNumber As String)


' Это промежуточный итог (создаваемый с помощью алгоритма Луна)


2 Dim SumOfDigits


3 SumOfDigits = 0


' Эта переменная определяет, в какой вы находитесь позиции,


' нечетной или четной.


' Вы начинаете с нечетной позиции (1)


4 Dim OddNumbered


5 OddNumbered = True


2 В этом случае четные от начала номера, применяемого в качестве примера. — Пер.


6 Dim i


7 For i = Len(CardNumber) To 1 Step -1


8 Dim CurrentNumber


9 CurrentNumber = Mid(CardNumber, i, 1)


10 If OddNumbered = False Then


' Цифра удваивается


11 CurrentNumber = CurrentNumber * 2


12 If CurrentNumber >= 10 Then '


' Если результат состоит из двух цифр, они складываются.


' Это странная часть, поскольку нужно использовать


' функции преобразования строк


13 Dim NumText As String


14 NumText = CurrentNumber


15 CurrentNumber = Val(Left(NumText, 1)) +


16 Val(Right(NumText, 1))


17 End If


18 End If


' К промежуточному итогу добавляется полученное число


19 " SumOfDigits = SumOfDigits + CurrentNumber



‘Переход из нечетной позиции в четную или наоборот.


' Эта строка кода изменяет значение True на False или


' False на True


20 OddNumbered = Not OddNumbered


21 Next



' Если сумма кратна 10, номер допустимый


22 If SumOfDigits Mod 10 = 0 Then


23 ValidateCard = True


24 Else


25 ValidateCard = False


26 End If


27 End Function



Функция работает следующим образом.


■ В строке 1 объявляется функция. Обратите внимание на то, что у функции один параметр — текст с номером кредитной карты. Он явно определяется как строка с помощью оборота As String. Таким образом, вы избегаете ошибок, возникающих при попытке передать в функцию число.


■ В строках 2—3 создается переменная, хранящая в течение всего процесса обработки промежуточный итог.


■ В строках 4—5 создается переменная, которая следит за тем, в какой позиции номера вы находитесь, четной или нечетной, считая от конца номера.


■ В строках 6—7 начинается цикл For/Next. Этот цикл немного отличается от виденных вами ранее циклов, поскольку у него в конце есть выражение Step -1. Оно сообщает о том, что после каждого прохода цикла из счетчика вычитается 1 (в отличие от добавления 1 при стандартном поведении). Вы можете обрабатывать номер от конца к началу.

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования