2016-11-03 9 views
0

Это домашнее задание, над которым я работал, чтобы вычислить, действительно ли номер кредитной карты. Он имеет много шагов и использует две другие вспомогательные функции.Проверьте действительный номер кредитной карты, используя python

Первая вспомогательная функция делает список, состоящий из каждой цифры в п:

def intToList(n): 
    strr = [num for num in str(n)] 
    theList = list(map(int, strr)) 
    return theList 

Вторая вспомогательная функция добавляет сумму цифр в числе. Например:

def addDigits(n): 
    sums = 0 
    while n: 
     if n > 0:   
      sums += n % 10 
      n //= 10 
     else: 
      return 
    return sums 

>>>(332) #(3+3+2) = 7 
>>> 7 

Таким образом, функция, над которой я работаю, - это подтвердить 16-значный номер кредитной карты. Он имеет конкретные приказы следовать в указанном порядке.

  1. Проверяет, что он содержит только цифры. #Готово.
  2. Проверяет, что это 16 цифр. #Готово.
  3. Если n - это строка, она преобразует ее в целое число.
  4. создает список, используя функцию intToList (n).
  5. Умножает нечетные индексы списка, сделанные intToList (n) на 2, и любые продукты, которые производят двузначные числа, заменяются суммой цифр, используя функцию addDigits (n).
  6. Вычисляет сумму всех одиночных цифр в списке, сделанных моим intToList (n). Если сумма равна 0 по модулю 10, исходное значение n является действительным номером кредитной карты.

Как прямо сейчас у меня есть это:

def checkCreditCard(n): 
    #Suppose to convert n to int. 
    n = int(n) 
    #Helper function 1 to make a list. 
    myList = intToList(n) 
    #For loop to apply the math to each odd indices.* 
    for ele in myList: 
     if ele % 2 == 1: 
      ele *= 2 
     if ele >= 10: 
      single = addDigits(?) #not sure what to put I've tried everything 
     if sum(myList) % 10 == 0: 
      return True 
     return False 

Вот мой вопрос, я не уверен, куда идти отсюда. Я уверен, что приведенный выше код правилен до сих пор, но я не знаю, как сделать продукты, которые производят двузначные числа, вычислять на одиночные цифры, используя мою функцию, и вычисляет сумму всех одиночных цифр в списке.

Любая помощь была бы принята с благодарностью. Дай мне знать, смогу ли я что-нибудь прояснить.

добавил, с чем я работал.

ответ

1

Простой трюк: сумма цифр всех чисел от 10 до 18 (возможные двухзначные значения для удвоения или добавления однозначных значений) может быть вычислена просто путем вычитания 9. Так что если у вас есть возможное единое, возможно двойное значение цифр, вы можете использовать его в качестве одной цифры с:

singledigit = maybetwodigit - 9 * (maybetwodigit >= 10) 

Для записи, ваш код, как написано это не правильно:

def checkCreditCard(n): 
    #My checks for length and digits. 
    if len(str(n)) == 16 and str(n).isdigit(): 
     return True 
    else: 
     return False 
    # nothing at this line or below will ever execute, because both your if 
    # and else conditions return 

Кроме того, ваш (в настоящее время неиспользуемый) цикл никогда не будет работать, потому что вы не назначаете то, что вы рассчитали. Вы, вероятно, хотите что-то вроде этого:

for i, ele in enumerate(myList): 
    if i % 2 == 1: 
     ele *= 2 
     myList[i] = ele - 9 * (ele >= 10) # Seamlessly sum digits of two digit nums 
+0

Проблема в том, что я должен использовать вспомогательную функцию addDigits (n), чтобы сделать любые возможные двузначные значения в одноразрядное значение. например, 8 * 2 = 16 после того, как функция addDigits (n) пройдет через нее, она должна взять 16 и сделать ее 7. – thatoneguy

+0

@thatoneguy: Yup. Это ярлык, чтобы избежать необходимости добавлять цифры. Если у вас есть 16, вычитание 9 дает вам 7 (сумма 1 и 6).17 - 9 = 8 (сумма 1 и 7) и т. Д. – ShadowRanger

+0

В качестве части задания я должен использовать вспомогательную функцию. Я хотел бы использовать ярлык, но мое задание требует, чтобы я использовал функцию. – thatoneguy

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