Алгоритм Луна на языке Go
Алгоритм Луна (также известный как алгоритм mod 10 или алгоритм проверки по модулю 10) — это простая контрольная формула для проверки различных идентификационных номеров, таких как номера кредитных карт, IMEI мобильных телефонов, национальные идентификационные номера и др. Алгоритм был разработан IBM ученым Хансом Петером Луном в 1954 году. Сегодня он широко используется для проверки корректности ввода номеров кредитных карт в онлайн-формах.
Давайте рассмотрим пошаговый пример реализации алгоритма Луна в Go.
Ввод: 4532015112830366
Шаг 1: Преобразовать входную строку в массив цифр
s = 4532015112830366
digits = [4, 5, 3, 2, 0, 1, 5, 1, 1, 2, 8, 3, 0, 3, 6, 6]
Шаг 2: Применить преобразование Луна
- начинаем с самой правой цифры
- проходимся по цифрам справа налево
- для каждой цифры проверяем, находится ли она на четном месте при счете справа налево (позиции 2, 4, 6, и т.д.)
- если она находится на четном месте при счете справа налево, умножаем ее на 2 и при необходимости складываем цифры произведения
Пример (нумерация справа налево начинается с позиции 1):
Итерация 1
- Цифра:
6
(крайняя правая, позиция 1) - Нечетная позиция, оставляем значение без изменений:
digits[15] = 6
Итерация 2
- Цифра:
6
(позиция 2) - Четная позиция, умножаем значение на 2:
6 * 2 = 12
- Суммируем цифры полученного произведения:
1 + 2 = 3
- Обновляем значение в массиве:
digits[14] = 3
Итерация 3
- Цифра:
3
(позиция 3) - Нечетная позиция, оставляем значение без изменений:
digits[13] = 3
Итерация 4
- Цифра:
0
(позиция 4) - Четная позиция, умножаем значение на 2:
0 * 2 = 0
- Обновляем значение в массиве:
digits[12] = 0
Итерация 5
- Цифра:
3
(позиция 5) - Нечетная позиция, оставляем значение без изменений:
digits[11] = 3
Итерация 6
- Цифра:
8
(позиция 6) - Четная позиция, умножаем значение на 2:
8 * 2 = 16
- Суммируем цифры полученного произведения:
1 + 6 = 7
- Обновляем значение в массиве:
digits[10] = 7
Итерация 7
- Цифра:
2
(позиция 7) - Нечетная позиция, оставляем значение без изменений:
digits[9] = 2
Итерация 8
- Цифра:
1
(позиция 8) - Четная позиция, умножаем значение на 2:
1 * 2 = 2
- Обновляем значение в массиве:
digits[8] = 2
Итерация 9
- Цифра:
1
(позиция 9) - Нечетная позиция, оставляем значение без изменений:
digits[7] = 1
Итерация 10
- Цифра:
5
(позиция 10) - Четная позиция, умножаем значение на 2:
5 * 2 = 10
- Суммируем цифры полученного произведения:
1 + 0 = 1
- Обновляем значение в массиве:
digits[6] = 1
Итерация 11
- Цифра:
1
(позиция 11) - Нечетная позиция, оставляем значение без изменений:
digits[5] = 1
Итерация 12
- Цифра:
0
(позиция 12) - Четная позиция, умножаем значение на 2:
0 * 2 = 0
- Обновляем значение в массиве:
digits[4] = 0
Итерация 13
- Цифра:
2
(позиция 13) - Нечетная позиция, оставляем значение без изменений:
digits[3] = 2
Итерация 14
- Цифра:
3
(позиция 14) - Четная позиция, умножаем значение на 2:
3 * 2 = 6
- Обновляем значение в массиве:
digits[2] = 6
Итерация 15
- Цифра:
5
(позиция 15) - Нечетная позиция, оставляем значение без изменений:
digits[1] = 5
Итерация 16
- Цифра:
4
(позиция 16) - Четная позиция, умножаем значение на 2:
4 * 2 = 8
- Обновляем значение в массиве:
digits[0] = 8
Итоговый результат всех итераций
digits = [8, 5, 6, 2, 0, 1, 1, 1, 2, 2, 7, 3, 0, 3, 3, 6]
Шаг 3: Вычисляем сумму элементов полученного массива
sum = 8 + 5 + 6 + 2 + 0 + 1 + 1 + 1 + 2 + 2 + 7 + 3 + 0 + 3 + 3 + 6 = 50
Шаг 4: Проверяем, что полученная сумма делится на 10
без остатка
Результат
Введенное значение 4532015112830366
является допустимым числом Луна, так как полученная сумма (50) делится на 10 без остатка.