Подтвердить что ты не робот

Разделить целое число на цифры для вычисления контрольной суммы ISBN

Я пишу программу, которая вычисляет контрольную цифру номера ISBN. Я должен прочитать ввод пользователя (девять цифр ISBN) в целочисленную переменную, а затем умножить последнюю цифру на 2, вторую последнюю цифру на 3 и так далее. Как я могу "разделить" целое число на его составляющие цифры? Поскольку это основное домашнее задание, я не должен использовать список.

4b9b3361

Ответ 1

Просто создайте из него строку.

myinteger = 212345
number_string = str(myinteger)

Это достаточно. Теперь вы можете перебирать его:

for ch in number_string:
    print ch # will print each digit in order

Или вы можете нарезать его:

print number_string[:2] # first two digits
print number_string[-3:] # last three digits
print number_string[3] # forth digit

Или лучше, не конвертируйте ввод пользователя в целое число (пользователь вводит строку)

isbn = raw_input()
for pos, ch in enumerate(reversed(isbn)):
    print "%d * %d is %d" % pos + 2, int(ch), int(ch) * (pos + 2)

Для получения дополнительной информации прочтите учебник.

Ответ 2

while number:
    digit = number % 10

    # do whatever with digit

    # remove last digit from number (as integer)
    number //= 10

На каждой итерации цикла он удаляет последнюю цифру из числа, назначая ее digit. Он в обратном порядке, начинается с последней цифры, заканчивается первым

Ответ 3

list_of_ints = [int(i) for i in str(ISBN)]

Дает вам упорядоченный список int. Конечно, учитывая утиную печать, вы могли бы также работать со строкой (ISBN).

Изменить: как упоминалось в комментариях, этот список не сортируется в смысле возрастания или нисхождения, но в теории он не имеет определенного порядка (наборы, словари и т.д. в теории python этого не делают, хотя на практике порядок имеет тенденцию быть достаточно надежным). Если вы хотите его отсортировать:

list_of_ints.sort()

- твой друг. Обратите внимание, что sort() сортируется на месте (как и в действительности, фактически изменяет порядок существующего списка) и не возвращает новый список.

Ответ 4

В более старых версиях Python...

map(int,str(123))

В новой версии 3k

list(map(int,str(123)))

Ответ 5

(number/10**x)%10

Вы можете использовать это в цикле, где number - полный номер, x - каждая итерация цикла (0,1,2,3,..., n), где n - точка останова. x = 0 дает место, x = 1 дает десятки, x = 2 дает сотни и т.д. Имейте в виду, что это даст значение цифр справа налево, поэтому это может быть не для ISBN, но оно все равно будет изолировать каждую цифру.

Ответ 6

Преобразуйте его в строку и сопоставьте его с помощью функции int().

map(int, str(1231231231))

Ответ 7

Рекурсивная версия:

def int_digits(n):
    return [n] if n<10 else int_digits(n/10)+[n%10]

Ответ 8

Преобразование в str, безусловно, медленнее, чем деление на 10.

map слабее, чем понимание списка:

convert to string with map 2.13599181175
convert to string with list comprehension 1.92812991142
modulo, division, recursive 0.948769807816
modulo, division 0.699964046478

Эти времена были возвращены следующим кодом на моем ноутбуке:

foo = """\
def foo(limit):
    return sorted(set(map(sum, map(lambda x: map(int, list(str(x))), map(lambda x: x * 9, range(limit))))))

foo(%i)
"""

bar = """\
def bar(limit):
    return sorted(set([sum([int(i) for i in str(n)]) for n in [k *9 for k in range(limit)]]))

bar(%i)
"""

rac = """\
def digits(n):
    return [n] if n<10 else digits(n / 10)+[n %% 10]

def rabbit(limit):
    return sorted(set([sum(digits(n)) for n in [k *9 for k in range(limit)]]))

rabbit(%i)
"""

rab = """\
def sum_digits(number):
  result = 0
  while number:
    digit = number %% 10
    result += digit
    number /= 10
  return result

def rabbit(limit):
    return sorted(set([sum_digits(n) for n in [k *9 for k in range(limit)]]))

rabbit(%i)
"""


import timeit

print "convert to string with map", timeit.timeit(foo % 100, number=10000)
print "convert to string with list comprehension", timeit.timeit(bar % 100, number=10000)
print "modulo, division, recursive", timeit.timeit(rac % 100, number=10000)
print "modulo, division", timeit.timeit(rab % 100, number=10000)

Ответ 9

Используйте тело этого цикла, чтобы делать все, что хотите, с цифрами

for digit in map(int, str(my_number)):

Ответ 10

Я сделал эту программу, и вот бит кода, который фактически вычисляет контрольную цифру в моей программе

    #Get the 10 digit number
    number=input("Please enter ISBN number: ")

    #Explained below
    no11 = (((int(number[0])*11) + (int(number[1])*10) + (int(number[2])*9) + (int(number[3])*8) 
           + (int(number[4])*7) + (int(number[5])*6) + (int(number[6])*5) + (int(number[7])*4) +
           (int(number[8])*3) + (int(number[9])*2))/11)

    #Round to 1 dp
    no11 = round(no11, 1)

    #explained below
    no11 = str(no11).split(".")

    #get the remainder and check digit
    remainder = no11[1]
    no11 = (11 - int(remainder))

    #Calculate 11 digit ISBN
    print("Correct ISBN number is " + number + str(no11))

Его длинная строка кода, но она разбивает число вверх, умножает цифры на соответствующую сумму, складывает их вместе и делит их на 11, в одной строке кода. Функция .split() просто создает список (разделяется на десятичную), поэтому вы можете взять 2-й элемент в списке и взять это с 11, чтобы найти контрольную цифру. Это также можно сделать еще более эффективным, изменив эти две строки:

    remainder = no11[1]
    no11 = (11 - int(remainder))

Для этого:

    no11 = (11 - int(no11[1]))

Надеюсь, что это поможет:)

Ответ 11

Как и в this, но более "питоновский" способ перебора по digis будет:

while number:
    # "pop" the rightmost digit
    number, digit = divmod(number, 10)

Ответ 12

Как насчет однострочного списка цифр...

ldigits = lambda n, l=[]: not n and l or l.insert(0,n%10) or ldigits(n/10,l)

Ответ 13

Ответ: 165

Метод: грубая сила! Вот крошечный бит кода Python (версия 2.7), чтобы считать все.

from math import sqrt, floor
is_ps = lambda x: floor(sqrt(x)) ** 2 == x
count = 0
for n in range(1002, 10000, 3):
    if n % 11 and is_ps(sum(map(int, str(n)))):
        count += 1
        print "#%i: %s" % (count, n)

Ответ 14

Предполагая, что вы хотите получить i-ю наименьшую значащую цифру из целого числа x, вы можете попробовать:

(abs(x)%(10**i))/(10**(i-1))

Надеюсь, это поможет.

Ответ 15

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

Все примеры, протестированные с CPython 3.5 в операционной системе GNU/Linux Debian 8.


Использование рекурсии

код

def get_digits_from_left_to_right(number, lst=None):
    """Return digits of an integer excluding the sign."""

    if lst is None:
        lst = list()

    number = abs(number)

    if number < 10:
        lst.append(number)
        return tuple(lst)

    get_digits_from_left_to_right(number // 10, lst)
    lst.append(number % 10)

    return tuple(lst)

Демонстрационный

In [121]: get_digits_from_left_to_right(-64517643246567536423)
Out[121]: (6, 4, 5, 1, 7, 6, 4, 3, 2, 4, 6, 5, 6, 7, 5, 3, 6, 4, 2, 3)

In [122]: get_digits_from_left_to_right(0)
Out[122]: (0,)

In [123]: get_digits_from_left_to_right(123012312312321312312312)
Out[123]: (1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 1, 3, 1, 2, 3, 1, 2, 3, 1, 2)

Используя функцию divmod

код

def get_digits_from_right_to_left(number):
    """Return digits of an integer excluding the sign."""

    number = abs(number)

    if number < 10:
        return (number, )

    lst = list()

    while number:
        number, digit = divmod(number, 10)
        lst.insert(0, digit)

    return tuple(lst)

Демонстрационный

In [125]: get_digits_from_right_to_left(-3245214012321021213)
Out[125]: (3, 2, 4, 5, 2, 1, 4, 0, 1, 2, 3, 2, 1, 0, 2, 1, 2, 1, 3)

In [126]: get_digits_from_right_to_left(0)
Out[126]: (0,)

In [127]: get_digits_from_right_to_left(9999999999999999)
Out[127]: (9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9)

Используя конструкцию tuple(map(int, str(abs(number)))

In [109]: tuple(map(int, str(abs(-123123123))))
Out[109]: (1, 2, 3, 1, 2, 3, 1, 2, 3)

In [110]: tuple(map(int, str(abs(1412421321312))))
Out[110]: (1, 4, 1, 2, 4, 2, 1, 3, 2, 1, 3, 1, 2)

In [111]: tuple(map(int, str(abs(0))))
Out[111]: (0,)

Используя функцию re.findall

In [112]: tuple(map(int, re.findall(r'\d', str(1321321312))))
Out[112]: (1, 3, 2, 1, 3, 2, 1, 3, 1, 2)

In [113]: tuple(map(int, re.findall(r'\d', str(-1321321312))))
Out[113]: (1, 3, 2, 1, 3, 2, 1, 3, 1, 2)

In [114]: tuple(map(int, re.findall(r'\d', str(0))))
Out[114]: (0,)

Используя модуль decimal

In [117]: decimal.Decimal(0).as_tuple().digits
Out[117]: (0,)

In [118]: decimal.Decimal(3441120391321).as_tuple().digits
Out[118]: (3, 4, 4, 1, 1, 2, 0, 3, 9, 1, 3, 2, 1)

In [119]: decimal.Decimal(-3441120391321).as_tuple().digits
Out[119]: (3, 4, 4, 1, 1, 2, 0, 3, 9, 1, 3, 2, 1)