#python
Вопрос:
Поэтому я должен был проверить, является ли входной номер номером UPC или нет. Я должен разрешить начальные нули и учесть их при расчете.
Вот мой текущий код, он работает для всех чисел, кроме числа с начальными нулями:
Условие для кода UPC действительно:
- Вычислите сумму умножения индекса нечетных цифр на 3 и индекса четных цифр на 1 входного числа.
- Вычислите сумму, которую мы только что сделали по модулю 10, получите цифру результата.
- Если результирующая цифра находится между 1 и 9, то вычтите результирующую цифру из 10. Если результирующая цифра равна 0, добавьте 0 к базовому номеру, чтобы получить завершенное число.
def UPC_code(num):
sum_digit = 0
index = 0
num_temp = str(num)[:-1]
len_nt = len(num_temp)
for digit in num_temp:
if (index 1) % 2 != 0: # If number position is odd
sum_digit = int(digit) * 3 # Sum = digit * 3
if index < len_nt: # Increase index till end
index = 1
elif (index 1) % 2 == 0: # If number position is even
sum_digit = int(digit) * 1 # Sum = digit * 1
if index < len_nt:
index = 1
# print(sum_digit)
res_digit = sum_digit % 10
if 1 <= res_digit <= 9:
res_digit = 10 - res_digit # Res digit meet condition = 10 - res digit
if res_digit == num % 10:
return True
elif res_digit != num % 10:
return False
else:
print("Something went wrong")
# End UPC_code()
Вызовите UPC_code()
import code_check.py as cc
num = str(input())
num_int = int(num)
if cc.UPC_code(num_int) is True and num_int != 0:
print(num, "valid UPC code.")
else:
print("Not valid")
Ожидаемый вклад:
042100005264
Ожидаемый результат:
042100005264 valid UPC code
Фактический объем производства:
Not valid
Комментарии:
1. Каковы условия для того, чтобы код UPC был действительным?
2. @not_speshal Я добавил его, большое спасибо!
3. Вы можете значительно упростить свой код с помощью нарезки строк. Предполагая использование
num
в качестве 12-значной строки,sum(int(x) for x in num[:-1:2])
будет вычислена сумма нечетных цифр иsum(int(x) for x in num[1:-1:2])
будет вычислена сумма четных цифр. В последнем случае1:-1:2
означает «начните с индекса 1 (2-я цифра), до последней цифры, но не включая последнюю цифру, шаг за шагом 2». Тогда контрольная цифра становитсяcheck = (10 - (odd * 3 even) % 10) % 10
.
Ответ №1:
это работает для всех чисел, кроме числа с начальными нулями
Как вы, несомненно, обнаружили, python не позволяет вам писать 0700
. Исторически это означало 0o700
бы или 448 , что, скорее всего, не то, что вы хотите в любом случае…
В этом случае решение простое. Если вам нужно обрабатывать числа , например 00007878979345
, обрабатывать строки.
Таким образом, переработайте свой код, чтобы получить строку. В качестве бонуса, int("000008")
есть 8
, так что, когда вам нужен номер как номер, вам даже не нужно ничего делать.
Комментарии:
1. Правильный. Все, что ему нужно сделать, это изменить входные данные для своей функции на строку, а затем он может переходить по одному символу за раз, проводить тест и снова выводить строку, если она пройдет.
2. Спасибо за вашу помощь! Я искал вокруг в то же время, но, похоже, невозможно заставить его работать с чистым интергером.
3. действительно—из-за исторического значения ведущих нулей (означающих восьмеричное число)