Алгоритм Луна на языке 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 без остатка.

© 2025 Praxis. Все права защищены.