Алгоритм контрольной цифры Python3 - PullRequest
0 голосов
/ 25 августа 2018

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

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

z 1 z 2 z 3 z 4 z 5 z 6 z 7 z 8 z 9 z 10

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

s = 1 * z 1 + 2 * z 2 + 3 * z 3 + 4 * z 4 + 5 * z 5 + 6 * z 6 + 7 * z 7 + 8 * z 8 + 9 * z 9

Контрольная цифра z 10 являетсяостаток от целочисленного деления 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 ]

0 голосов
/ 25 августа 2018

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

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

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

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
0 голосов
/ 25 августа 2018

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

0 голосов
/ 25 августа 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...