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

Следующий шаг после статьи

Закрепите тему во вводном проекте без регистрации, а затем переходите к курсам.

Продолжить изучение

Выбери следующую статью по маршруту или углубись в смежную тему.

Похожие статьи