Разбить целое число на цифры, чтобы вычислить контрольную сумму ISBN - PullRequest
50 голосов
/ 10 июня 2009

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

Ответы [ 15 ]

1 голос
/ 14 января 2014

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

for digit in map(int, str(my_number)):
0 голосов
/ 11 марта 2017

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

Все примеры протестированы на 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)
0 голосов
/ 16 сентября 2015

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

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

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

0 голосов
/ 14 сентября 2015

Ответ: 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)
0 голосов
/ 14 сентября 2010

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

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