Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1200 / 769 / 128
Регистрация: 10.03.2012
Сообщений: 4,968

Алгоритм Луна

28.02.2025, 20:38. Показов 2731. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для шестнадцатизначного номера банковской карты, определите корректность ее номера в соответствии с алгоритмом Луна. Дано целое положительное шестнадцатизначное число - номер банковской карты. Вывести "Да", если номер карты является корректным или "Нет".
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.02.2025, 20:38
Ответы с готовыми решениями:

Подскажите алгоритм реализации отношений в Джанге
Нужно реализовать различные отношения между пользователями (типа как в вк): друзья, коллеги, муж/жена и т.п.. Некоторые из них не требуют...

Алгоритм генерации строк из заданных символов
Помогите написать алгоритм на python, которая из символов строки генерит все возможные варианты например из строки -> арп ...

Алгоритм при работе с файлами
Возникла проблема в программе: 1. На входе имеем дирректорию, нам нужно обойти в ней все поддикректории и файлы, создать хеш всех файлов...

7
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38201 / 21133 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
01.03.2025, 09:27
Дословный перевод из Википедии:

Python
1
2
3
4
5
6
7
8
9
10
11
12
def check_Luhn(inp_num):
    str_num=str(inp_num)
    sz=len(str_num)
    par=sz%2
    for i in range(sz-1):
        dig=int(str_num[i])
        if i%2 == par:
            dig=dig*2
            if dig > 9:
                dig=dig-9
        sum=sum+dig
    return sum%10 == 0
3
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,332
01.03.2025, 17:07
Как вариант:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def luhn_checksum(card_number):
    def digits_of(n):
        return [int(d) for d in str(n)]
    digits = digits_of(card_number)
    odd_digits = digits[-1::-2]
    even_digits = digits[-2::-2]
    checksum = 0
    checksum += sum(odd_digits)
    for d in even_digits:
        checksum += sum(digits_of(d*2))
    return checksum % 10
 
def is_luhn_valid(card_number):
    return luhn_checksum(card_number) == 0
 
 
result = is_luhn_valid(4532015112830366)
print ('Correct:' + str(result))
result = is_luhn_valid(6011514433546201)
print ('Correct:' + str(result))
result = is_luhn_valid(6771549495586802)
print ('Correct:' + str(result))
Добавлено через 7 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
num = list(input("Please enter the number to test (no space, no symbols, only \
numbers): "))
 
num = list(map(int, num))[::-1]
 
for index in range(1,len(num),2):
    if num[index]<5:
        num[index] = num[index] *2
    else: 
        num[index] = ((num[index]*2)//10) + ((num[index]*2)%10)
 
checksum=sum(num)
 
print("checksum= {}".format(checksum))
 
if checksum%10 !=0:
    print('the number is not valid')
else:
    print('the number is valid!')
Добавлено через 7 минут
Еще вариант:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
check_numbers = ['49927398716', '4847352989263095', '79927398713', '5543352315777720']
 
def Luhn_Check(number):
 
 
    reverse_numbers = [int(x) for x in number[::-1]] # convert args to int, reverse the numbers, put into a list
    dbl_digits = list() # create empty list
    digits = list(enumerate(reverse_numbers, start=1)) # enumerate numbers starting with an index of 1
 
    for index, digit in digits:
        if index % 2 == 0:  # double every second (other) digit.
 
            doub_digit = digit * 2
            dbl_digits.append(doub_digit - 9) if doub_digit > 9 else dbl_digits.append(doub_digit)
 
        else:
            # if not '0' append to list (this would be the 1 in Luhn algo sequence (1 2 1 2 ...)
            dbl_digits.append(digit)
 
    return sum(dbl_digits) % 10
 
 
if (__name__ == "__main__"):
    print("Valid Numbers: %s " % [x for x in check_numbers if Luhn_Check(x) == 0])
Добавлено через 9 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from functools import reduce
 
 
def luhn(code):
    
    LOOKUP = (0, 2, 4, 6, 8, 1, 3, 5, 7, 9)
    code = reduce(str.__add__, filter(str.isdigit, code))
    evens = sum(int(i) for i in code[-1::-2])
    odds = sum(LOOKUP[int(i)] for i in code[-2::-2])
    return ((evens + odds) % 10 == 0)
 
 
print("Прошел проверку: ", luhn('4561 2612 1234 5467'))
print("Не прошел проверку: ", luhn('4561 2612 1234 5464'))
Добавлено через 1 час 3 минуты
Строго не судите:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def luhn_algo(num):
    check_sum = 0
    num_parity = len(num) % 2
    for l in range(len(num) - 1, -1, -1):
        j = int(num[l])
        if (l + 1) % 2 != num_parity:
            j = j * 2
        if j > 9:
            j = j - 9
        check_sum = check_sum + j
    print("value calculated = ", str(check_sum))
    return check_sum % 10 == 0
 
 
for n in (49927398716, 49927398717, 1234567812345678, 1234567812345670):
    print(str(n) + " =>", luhn_algo(str(n)))
Добавлено через 3 минуты
Python
1
2
3
4
5
6
7
def luhn_algo(num):
    rev = [int(ch) for ch in str(num)][::-1]
    return (sum(rev[0::2]) + sum(sum(divmod(d * 2, 10)) for d in rev[1::2])) % 10 == 0
 
 
for num2 in (49927398716, 49927398717, 1234567812345678, 1234567812345670):
    print(num2, luhn_algo(num2))
Добавлено через 14 минут
Менее эффективный и громоский:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def validate_credit_card_number(card_number):
    #start writing your code here
 
    #Step 1a - complete
    temp_list=list(str(card_number))
    my_list=[]
    list1 = temp_list[-2::-2]
    list2=temp_list[::-2]
    list2 = [int (n) for n in list2]
    #print(list2)
    my_list=[int(n) for n in list1]
    #print(my_list)
    list1 = [int(n)*2 for n in list1]
    t_list=list1
 
    for el in list1:
        sum_res=0
 
        if el>9:
            idx = list1.index(el)
            t_list.pop(idx)
 
            while el:
                rem = el%10
                sum_res+=rem
                el = el//10 
            t_list.insert(idx, sum_res)
    #print(t_list)
 
    #step 1b
 
    list1_sum=sum(t_list)
    list2_sum = sum(list2)
    #print(b_list)
    final_sum = list1_sum+ list2_sum
    #print(final_sum)
 
    if final_sum%10==0:
        return True
    return False
 
card_number= 1456734512345698 #4539869650133101  #1456734512345698 # #5239512608615007
 
result=validate_credit_card_number(card_number)
if(result):
    print("credit card number is valid")
else:
    print("credit card number is invalid")
Добавлено через 44 секунды
Получше:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def validate_credit_card_number(card_number):
    temp_list = [int(c) for c in str(card_number)]
 
    list1 = temp_list[-2::-2]
    list2 = temp_list[::-2]
 
    total_sum = sum(list2)
    for el in list1:
        el *= 2
        while el:
            el, rem = divmod(el, 10)
            total_sum += rem
 
    return total_sum % 10 == 0
 
TESTS = [
    (1456734512345698, False),
    (4539869650133101, True),
    (1456734512345698, False),
    (5239512608615007, True),
]
 
for (card_number, expected_valid) in TESTS:
    valid = validate_credit_card_number(card_number)
    assert valid == expected_valid
    result = validate_credit_card_number(card_number)
    if (result):
        print("credit card number is valid")
    else:
        print("credit card number is invalid")
3
1200 / 769 / 128
Регистрация: 10.03.2012
Сообщений: 4,968
11.04.2025, 11:55  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def luna_algo(card_num) -> bool:
    even_nums = [int(num) * 2 for num in str(card_num)[::2]]
    for index in range(len(even_nums)):
        if not even_nums[index] > 9:
            continue
        num_digits = list(str(even_nums[index]))
        even_nums[index] = sum(
            [int(x) for x in num_digits]
        )
 
    odd_nums = [int(num) for num in str(card_num)[1::2]]
    res_sum = sum(even_nums) + sum(odd_nums)
    return res_sum % 10 == 0
1
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,332
13.04.2025, 13:44
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def checkLuhn(cardNo):
    nDigits = len(cardNo)
    nSum = 0
    isSecond = False
 
    for i in range(nDigits - 1, -1, -1):
        d = ord(cardNo[i]) - ord('0')
 
        if (isSecond == True):
            d = d * 2
 
 
        nSum += d // 10
        nSum += d % 10
 
        isSecond = not isSecond
 
    if (nSum % 10 == 0):
        return True
    else:
        return False
 
 
 
if __name__ == "__main__":
 
    cardNo = input()
 
    if (checkLuhn(cardNo)):
        print("This is a valid card")
    else:
        print("This is not a valid card")
Добавлено через 46 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def validate_credit_card(card_number: str) -> bool:
    
    card_number = [int(num) for num in card_number]
 
    
    checkDigit = card_number.pop(-1)
 
    
    card_number.reverse()
 
    
    card_number = [num * 2 if idx % 2 == 0
                   else num for idx, num in enumerate(card_number)]
 
   
    card_number = [num - 9 if idx % 2 == 0 and num > 9
                   else num for idx, num in enumerate(card_number)]
 
    
    card_number.append(checkDigit)
 
    
    checkSum = sum(card_number)
 
    
    return checkSum % 10 == 0
 
card_number = input()
if __name__ == '__main__':
 print("This is a valid card")
else:
 print("This is not a valid card")
2
2 / 2 / 0
Регистрация: 23.12.2024
Сообщений: 12
13.04.2025, 18:40
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def is_valid_card_number(card_number):
    card_number = str(card_number)
    if len(card_number) != 16:
        return "Нет"
    
    total_sum = 0
    
    for i in range(16):
        digit = int(card_number[15 - i])
        if i % 2 == 1:
            digit *= 2
            if digit > 9:
                digit -= 9
        total_sum += digit
    
    if total_sum % 10 == 0:
        return "Да"
    else:
        return "Нет"


не понимаю, почему отступы в итоговом варианте не получаются(
2
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,332
20.04.2025, 14:55
APUka, ваш код почему то выдает, что номер карты правильный при любом вводе цифр, это не удовлетворяет условию алгоритма Луна
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def is_valid_card_number(card_number):
    card_number = str(card_number)
    if len(card_number) != 16:
        return "Нет"
 
    total_sum = 0
 
    for i in range(16):
        digit = int(card_number[15 - i])
        if i % 2 == 1:
            digit *= 2
            if digit > 9:
                digit -= 9
        total_sum += digit
 
    if total_sum % 10 == 0:
        return "Да"
    else:
        return "Нет"
card_number = input()
if __name__ == '__main__':
 print("This is a valid card")
else:
 print("This is not a valid card")
1
Фрилансер
Эксперт PythonЭксперт JSЭксперт PHP
 Аватар для Azdeman
1871 / 1362 / 604
Регистрация: 12.01.2011
Сообщений: 5,470
21.04.2025, 19:01
Цитата Сообщение от isaak Посмотреть сообщение
почему то выдает, что номер карты правильный при любом вводе цифр
В коде даже функция не вызвана

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def is_valid_card_number(card_number):
    card_number = str(card_number)
    if len(card_number) != 16:
        return False
    total_sum = 0
    for i in range(16):
        digit = int(card_number[15 - i])
        if i % 2 == 1:
            digit *= 2
            if digit > 9:
                digit -= 9
        total_sum += digit
    if total_sum % 10 == 0:
        return True
    else:
        return False
 
if __name__ == '__main__':
 card_number = input("Введите номер карты: ")
 is_valid_card = is_valid_card_number(card_number)
 if(is_valid_card):
    print("This is a valid card")
 else:
    print("This is not a valid card")
1
Фрилансер
Эксперт PythonЭксперт JSЭксперт PHP
 Аватар для Azdeman
1871 / 1362 / 604
Регистрация: 12.01.2011
Сообщений: 5,470
21.04.2025, 19:07
Цитата Сообщение от Catstail Посмотреть сообщение
range(sz-1)
У вас тут ошибка, не нужно -1 делать


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def check_Luhn(inp_num):
    str_num=str(inp_num)
    sz=len(str_num)
    par=sz%2
    sum = 0
    for i in range(sz):
        dig=int(str_num[i])
        if i%2 == par:
            dig=dig*2
            if dig > 9:
                dig=dig-9
        sum=sum+dig
    return sum%10 == 0
 
print(check_Luhn(4561261212345467))
2
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,332
22.04.2025, 09:03
Azdeman, спасибо немного модернизировал ваш код для ввод а значений карты с клавиатуры:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def check_Luhn(inp_num):
    str_num = str(inp_num)
    sz = len(str_num)
    par = sz % 2
    sum = 0
    for i in range(sz):
        dig = int(str_num[i])
        if i % 2 == par:
            dig = dig * 2
            if dig > 9:
                dig = dig - 9
        sum = sum + dig
    return sum % 10 == 0
 
 
if __name__ == '__main__':
 inp_num = input("Введите номер карты: ")
 check_Luhn = check_Luhn(inp_num)
 if(check_Luhn):
    print("This is a valid card")
 else:
    print("This is not a valid card")
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.04.2025, 09:03
Помогаю со студенческими работами здесь

Алгоритм для расчета
Всем привет. Подскажите, или перенаправьте в нужном направлении, а то не уверен, что в той ветке вопрос задаю))) Есть набор данных. В...

Помогите составить алгоритм
Доброго времени суток! взялся учить питон3, до этого с програмированием связан никак небыл, сам айтишник... хочу научиться писать, читаю...

Как узнать какой алгоритм работает быстрее?
Мне сейчас приходится работать со строками(хтмл страница) длиной по 40 000 символов (ASCII) надо из этой строки при помощи регулярных...

Правильно ли реализован алгоритм двоичного поиска?
проверьте пожулайста -все ли правильно написал... def main (arr, key): n = len(arr) first = 0 last = n mid ...

Алгоритм Олдоса-Бродера, Создание лабиринта
Здравствуйте, решил написать алгоритм Олдоса-Бродера, чтобы генерировать лабиринты, но лабиринты почему то не генерируются. Проверял свой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru