2017-02-19 31 views
0

Задача: Reports является ли введенный пользователем номер кредитной карты:"Индекс строковых линий вне диапазона 7." Что не так?

VISA, MASTERCARD, AMEX или INVALID

Amex: 15 цифр - начинается с 34/37

Мастеркард: 16 Digits - - начинается с 51/52/53/54/55

Visa: 13-16 Digits - начинается с 4

https://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm

Быстрый номер сверяться с: 378282246310005 "AMEX"

#Luhn algorithm to check credit card's number validity 
def Luhn (x, digits): 
    #Sum of every other number starting from before last n 
    sum1 = 0 
    i = 2 
    for i in range (digits): 
     digit = int(x[digits-i]) 
     if 2 * digit < 10: sum1 = sum1 + digit *2 
     else: sum1 = sum1 + 1 + (2 * digit -10) 
     i+=2 
    #Some of every other number starting from last n 
    sum2 = 0 
    i = 1 
    for i in range (digits): 
     digit = int(x[digits-i]) 
     sum2 = sum2 + digit 
     i+=2 
    #Some of both and condition return 
    if (sum1 + sum2) % 10 == 0: return True 
    else: return False 

def main(): 
    x = input("Insert your credit card's number for analysis\n") 
    # Length check 
    digits = len(x) 
    if digits <13 >16: 
     print("Invalid Length") 
     return 1 
    # Luhn algorithm check 
    check = Luhn(x, digits) 
    if check == False: 
     print("Invalid Card Number 'luhn'") 
     return 1 
    # Assigning letter id to first to numbers to determine card type 
    creditid1 = int(x[0]) 
    creditid2 = int(x[1]) 
    # Checking digits count and first to number to determine card type 
    if digits == 15 and creditid1 == 3 and (creditid2 == 4 or 7): 
     print("AMEX\n") 
    elif digits == 16 and creditid1 == 5 and (creditid2 == (1,6)): 
     print("MASTERCARD\n") 
    elif digits == 13 or 16 and creditid1 == 4: 
     print("VISA\n") 
    else: 
     print("Not Amex...\n Not Mastercard... \n Not Visa... \n") 

if __name__ == "__main__": 
    main() 
+0

Сначала я буду равен нулю. x [цифры] находится за пределами допустимого диапазона – jophab

+0

Да, но программа никогда не использует x [цифры]. Он, по крайней мере, начинается с x [цифр-1]. Но почему это все равно вне пределов досягаемости? – user627154

+0

диапазон (n) создает значения от 0 до n-1. –

ответ

0

На первый i будет равен нулю. Таким образом, x[digits-0], безусловно, вышел за пределы допустимого диапазона.

Позволяет изменить контур в

for i in range (1,digits+1): 

Кроме того, вы должны преобразовать входные данные в str типа перед использованием len().

Модифицированный код

#Luhn algorithm to check credit card's number validity 
def Luhn (x, digits): 
    #Sum of every other number starting from before last n 
    sum1 = 0 
    i = 2 
    for i in range (1,digits+1): 
     digit = int(x[digits-i]) 
     if 2 * digit < 10: sum1 = sum1 + digit *2 
     else: sum1 = sum1 + 1 + (2 * digit -10) 
     i+=2 
    #Some of every other number starting from last n 
    sum2 = 0 
    i = 1 
    for i in range (1,digits+1): 
     digit = int(x[digits-i]) 
     sum2 = sum2 + digit 
     i+=2 
    #Some of both and condition return 
    if (sum1 + sum2) % 10 == 0: return True 
    else: return False 

def main(): 
    x = str(input("Insert your credit card's number for analysis\n")) 
    # Length check 
    digits = len(x) 
    if digits <13 >16: 
     print("Invalid Length") 
     return 1 
    # Luhn algorithm check 
    check = Luhn(x, digits) 
    if check == False: 
     print("Invalid Card Number 'luhn'") 
     return 1 
    # Assigning letter id to first to numbers to determine card type 
    creditid1 = int(x[0]) 
    creditid2 = int(x[1]) 
    # Checking digits count and first to number to determine card type 
    if digits == 15 and creditid1 == 3 and (creditid2 == 4 or 7): 
     print("AMEX\n") 
    elif digits == 16 and creditid1 == 5 and (creditid2 == (1,6)): 
     print("MASTERCARD\n") 
    elif digits == 13 or 16 and creditid1 == 4: 
     print("VISA\n") 
    else: 
     print("Not Amex...\n Not Mastercard... \n Not Visa... \n") 

if __name__ == "__main__": 
    main() 
+0

Это решило ошибку, но все равно возвращает false. Какие-либо предложения? – user627154

+0

Вы заметили комментарий их пользователя? искать некоторые логические ошибки – jophab

+0

Да. Не вводит всегда возвращаемую строку? – user627154

0

Это классический вне по одному ошибке

Добавьте один к результату

digit = int(x[digits-i]) 

Как это

digit = int(x[digits-i+1]) 
+0

Спасибо, но это не тренировалось для меня – user627154

+0

Его интересный, неправильный способ делать что-то сделал наши работы для вас, и писать способ делать не стал! – Sarvex