Алгоритм Луна на языке Go
Алгоритм Луна (также известный как алгоритм mod 10 или алгоритм проверки по модулю 10) — это простая контрольная формула для проверки различных идентификационных номеров, таких как номера кредитных карт, IMEI мобильных телефонов, национальные идентификационные номера и др. Алгоритм был разработан IBM ученым Хансом Петером Луном в 1954 году. Сегодня он широко используется для проверки корректности ввода номеров кредитных карт в онлайн-формах.
Давайте рассмотрим пошаговый пример реализации алгоритма Луна в Go.
Ввод: 4532015112830366
Шаг 1: Преобразовать входную строку в массив цифр
s = 4532015112830366digits = [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 без остатка.