Алгоритм контрольной цифры Python3

Я учусь программировать, и мне было дано следующее задание:

ISBN (международный стандартный номер книги) состоит из 10 цифр.

z1 z2 z3 z4 z5 z6 z7 z8 z9 z10

Последняя цифра z10 является контрольной цифрой. Это сделано так: во-первых, вы создаете вид кросс-суммы с помощью этой формулы:

s = 1 * z1 + 2 * z2 + 3 * z3 + 4 * z4 + 5 * z5 + 6 * z6 + 7 * z7 + 8 * z8 + 9 * z9

Контрольная цифра z10 - это остаток от целочисленного деления s, деленный на 11. Для оставшейся части 10 вы пишете x или X. Пример: для ISBN 3826604237 вы получите контрольную цифру 7.

Расчет: 1*3+2*8+3*2+4*6+5*6+6*0+7*4+8*2+9*3 = 150

Остальная часть деления на 150 и 11 составляет 7.

Кодовое решение дано следующим образом:

# isbn.py
number = int(input("Please enter a 9-digit number: "))
z9 = number % 10
number = number//10
z8 = number % 10
number = number//10
z7 = number % 10
number = number//10
z6 = number % 10
number = number//10
z5 = number % 10
number = number//10
z4 = number % 10
number = number//10
z3 = number % 10
number = number//10
z2 = number % 10
number = number//10
z1 = number
sum = z1+2*z2+3*z3+4*z4+5*z5+6*z6+7*z7+8*z8+9*z9
checkdigit = sum%11
print("\nCheckdigit:", checkdigit)

Мой вопрос просто: как это работает? Почему я должен вычислять "число // 10" и "число% 10", и это все время? Есть ли название для этого типа алгоритма, и если да, то как он называется?

Буду признателен за любой ответ на этот вопрос, и если вам покажется, что это проще всего, и вы чувствуете, что я теряю ваше время, извините До сих пор я понимал почти все, что я изучал до сих пор, изучая Python, но эта задача казалась немного сложной (это было в очень ранней главе книги, которую я изучаю на работе), и я застрял и не получил это из моей головы.

Заранее спасибо и хорошего дня!

3 ответа

Решение

Операция x % 10 называется модулем и возвращает остаток от деления на 10. Вы используете его в своем коде, чтобы выделить самую правую цифру.

Следующая операция x // 10 называется "целочисленное деление", то есть деление, которое возвращает только целые числа (дробная часть (если есть) обрезается). Целочисленное деление на 10 для десятичного числа соответствует сдвигу прав на одну цифру, так что следующая цифра сдвигается в крайнее правое место.

Вы повторяете эти 2 шага, пока последняя цифра не будет изолирована. Затем вы выполняете умножения и, наконец, берете модуль 11 (остаток от деления на 11), чтобы получить контрольную цифру.

Этот повторяющийся код требует цикла. Представьте, что вам нужно обработать 100-значные числа.

Это началось с модульной аритметики. И модуль, длина ICBN и коэффициенты просто согласны, потому что коэффициенты не имеют значения (по модулю аритметических свойств (если x mod y = 0, чем k * x mod y = 0, где k - целое число)).

Ты используешь % модуль или целочисленное деление // чтобы получить одну цифру за раз.

Проще не преобразовать целое число в целое число, а затем извлечь отдельные цифры, но обрабатывать введенную строковую последовательность символов.

Добавьте некоторую проверку ввода, и вы получите:

while True:
    # don't convert to int
    # repeat until exactly 9 digits are given
    number = input("Please enter a 9-digit number: ").strip()  
    if number.isdigit() and len(number) == 9:
        break

# generator method - enumerate gives you the position and the value of each character 
# i.e. for enumerate('123') you get (0,'1') then (1,'2') then (2,'3')
# the sum function adds up each given tuple but premultiplies the value with its (pos+1) as position inside strings start at 0 for the 1st character - it also
# converts each single character to its integer value
s1 = sum( (pos+1)*int(num) for pos,num in enumerate(number)) 

# s1 is a summed generator expression for this: 
s2 = 0  # do not use sum - its a built-in functions name
for pos,num in enumerate(number):        
    s2 += (pos+1)*int(num)

print(s1,s2)  # both are the same ;o)

checkdigit = s1%11
print("\nCheckdigit:", checkdigit)

За 382660423 ты получаешь:

150 150

Checkdigit: 7
Другие вопросы по тегам