2015-09-18 3 views
0

Я работаю над этим проектом, в котором я должен проверить, действителен ли номер кредитной карты. В этом случае мне нужна только 8-значная кредитная карта (я знаю, что это не реальность). Вот вопросИспользование петель в python для настройки номера кредитной карты

Последняя цифра номера кредитной карты - контрольная цифра, которая защищает от ошибок транскрипции, таких как ошибка в одной цифре или переключение двух цифр. Следующий метод используется для проверки фактических номера кредитных карт, но для простоты мы будем описывать его для чисел с 8 цифр вместо 16:

• Начиная с самой правой цифры, образуют сумму всех остальных цифры , Например, если номер кредитной карты 4358 9795, то вы составите сумму 5 + 7 + 8 + 3 = 23.

• Двойные каждый из цифр, которые не были включены в предыдущем шаге. Добавьте все цифры полученных чисел. Например, с приведенным выше номером , удвоение цифр, начиная с следующего за последним, yields 18 18 10 8. Добавление всех цифр в эти значения дает 1 + 8 + 1 + 8 + 1 + 0 + 8 = 27.

• Добавьте суммы двух предыдущих шагов. Если последняя цифра результата равна 0, номер действителен. В нашем случае 23 + 27 = 50, поэтому число действительно.

Напишите программу, которая реализует этот алгоритм. Пользователь должен указать 8-значный номер, и вы должны распечатать, действительно ли это число или нет. Если это недействительно, вы должны напечатать значение контрольной цифры, которая сделает ее действительной.

Мне нужно использовать циклы, чтобы сделать сумму. Однако я не знаю, как использовать для этого циклы.

Вот мой код

# Credit Card Number Check. The last digit of a credit card number is the check digit, 
# which protects against transcription errors such as an error in a single digit or 
# switching two digits. The following method is used to verify actual credit card 
# numbers but, for simplicity, we will describe it for numbers with 8 digits instead 
# of 16: 
#  Starting from the rightmost digit, form the sum of every other digit. For 
#  example, if the credit card number is 43589795, then you form the sum 
#  5 + 7 + 8 + 3 = 23. 
# Double each of the digits that were not included in the preceding step. Add # all 
#  digits of the resulting numbers. For example, with the number given above, 
#  doubling the digits, starting with the next-to-last one, yields 18 18 10 8. Adding 
#  all digits in these values yields 1 + 8 + 1 + 8 + 1 + 0 + 8 = 27. 
#  Add the sums of the two preceding steps. If the last digit of the result is 0, the 
#  number is valid. In our case, 23 + 27 = 50, so the number is valid. 
# Write a program that implements this algorithm. The user should supply an 8-digit 
# number, and you should print out whether the number is valid or not. If it is not 
# valid, you should print out the value of the check digit that would make the number 
# valid. 

    card_number = int(input("8-digit credit card number: ")) 

rights = 0 
for i in card_number[1::2]: 
    rights += int(i) 

lefts = 0 
for i in card_number[::2]: 
    lefts += int(i)*2%10+int(i)*2/10 

print card_number, (rights +lefts)/10 

if remaining == 0: 
    print("Card number is valid") 

else: 
    print("Card number is invalid") 

    if digit_7 - remaining < 0: 
     checkDigit = int(digit_7 + (10 - remaining)) 
     print("Check digit should have been:", checkDigit) 

    else: 
     checkDigit = int(digit_7 - remaining) 
     print("Check digit should have been:", checkDigit) 
+0

Какова ваши ошибки? – wgwz

+0

Ошибок нет, мне нужно использовать циклы для этой программы и не знаю, как это сделать. Эта программа работает, но она не учитывает сумму альтернативных номеров и их удвоений. Последняя цифра общей суммы должна быть равна o. Контрольная цифра равна 4. – GopherTech

+0

Что вы думаете? Неясно, к чему конкретно вы пытаетесь получить помощь. Пожалуйста, отредактируйте/обновите свой вопрос, чтобы задать конкретный вопрос. –

ответ

0

Вот еще одно возможное решение:

cc_number = input("8-digit credit card number: ").replace(" ", "") 
total1 = 0 
total2 = 0 

for digit in cc_number[-1::-2]: 
    total1 += int(digit) 

for digit in cc_number[-2::-2]: 
    total2 += sum(int(x) for x in str(int(digit)*2)) 

remainder = (total1 + total2) % 10 

if remainder == 0: 
    print("Card is valid!") 
else: 
    invalid_check_digit = int(cc_number[-1]) 

    if invalid_check_digit - remainder < 0: 
     valid_check_digit = invalid_check_digit + (10 - remainder) 
    else: 
     valid_check_digit = invalid_check_digit - remainder 

    print("Card is invalid - the correct check digit is {}".format(valid_check_digit)) 

Давать вам следующий вывод:

8-digit credit card number: 4358 9795 
Card is valid! 

Или:

8-digit credit card number: 4358 9794 
Card is invalid - the correct check digit is 5 
+0

Привет, Мартин, спасибо за ответ. Как мы можем найти правильную контрольную цифру, если номер карты недействителен? – GopherTech

0

Вот решение с использованием numpy:

import numpy as np 
d1=np.transpose(np.array(list('43589795'), dtype=np.uint8).reshape((4,2)))[0]*2 
d2=np.transpose(np.array(list('43589795'), dtype=np.uint8).reshape((4,2)))[1] 
if (np.sum(np.hstack([list(entry) for entry in d1.astype(str)]).astype(np.uint8))+np.sum(d2))%10==0: 
    return "Validated" 

В случае примера, мы получаем 50, который проверенную.

0

Чернослив все пробелы из номера кредитной карты и попробуйте следующий код:

import itertools 
sum = 0 
for multiplicand,didgit in zip(itertools.cycle([2,1]), str(CREDIT_CARD_NUMBER)): 
    result = multiplicand * int(didgit) 
    sum += result/10 
    sum += result % 10 
print "valid" if sum % 10 == 0 else "invalid" 

Приведенный выше код перебирает номер кредитной карты и вычисляет обе суммы simultainously.

1

Если я правильно понимаю, вы ищете что-то вроде этого:

cards = ["43589795"] 
for card_number in cards: 
    rights = sum(map(int, card_number[1::2])) 
    lefts = sum(map(lambda x: int(x)*2%10+int(x)*2/10, card_number[::2])) # sum of doubled values 
    print card_number, (rights +lefts)/10 

же раствор без карты и лямбда магии:

rights = 0 
for i in card_number[1::2]: 
    rights += int(i) 

lefts = 0 
for i in card_number[::2]: 
    lefts += int(i)*2%10+int(i)*2/10 

print card_number, (rights +lefts)/10 

И полный ответ на ваш вопрос:

card_number = str(raw_input("8-digit credit card number: ")).replace(" ", "") 

rights = 0 
for i in card_number[1::2]: 
    rights += int(i) 

lefts = 0 
for i in card_number[::2]: 
    lefts += int(i)*2%10+int(i)*2/10 

remaining = (rights +lefts)%10 

digit_7 = int(card_number[-1]) # Last digit 

if remaining == 0: 
    print("Card number is valid") 

else: 
    print("Card number is invalid") 

    if digit_7 - remaining < 0: 
     checkDigit = int(digit_7 + (10 - remaining)) 
     print("Check digit should have been:", checkDigit) 

    else: 
     checkDigit = int(digit_7 - remaining) 
     print("Check digit should have been:", checkDigit) 
+0

Да, я! Можете ли вы импровизировать это в моем коде? Я буду очень благодарен! – GopherTech

+0

Что это значит? Это ваш алгоритм. Но вместо 'number', я использую массив чисел - карт. Карта это 'for loop'. – Jimilian

+0

Ну, здесь есть одна проблема. Мы еще не должны использовать массивы. Таким образом, технически мы можем использовать для циклов while и while, но не инструкцию def или массивы. – GopherTech

Смежные вопросы