[ Сборник задач ]
Тема 1. Целые числа

[ Сборник задач ]
Тема 1. Целые числа

Python Workbook Cover T1
Тип данных: int
Контент: Вопросы (3шт) + задачи (8шт)

Оглавление

1
Введение
Несколько слов о том, что из себя представляет целочисленный тип данных в Python, и какие операции можно с ним выполнять.
Перейти
2
Вопросы и ответы
3 вопроса по теме "Целые числа" + ответы
Перейти
3
Условия задач
8 задач по теме двух уровней сложности: Базовый и *Продвинутый
Перейти
4
Решения задач
Приводим код решений указанных выше задач
Перейти
1
One

Введение

Любое целое число независимо от объема потребляемой памяти в языке Python представлено типом int. Напишете ли вы 22 или 2222222222222222222222222222222, оно все равно будет определяться как int, просто в памяти вашего устройства это значение будет занимать разную память. В других языках программирования целые числа принадлежат к разным типам данных.

К слову, в Python большие числа для наглядности можно разделять нижними подчеркиваниями и они по-прежнему будут интерпретироваться как тип int. Пример: можно написать 200000000 и запутаться в нулях, а есть и такой вариант: 200_000_000 (согласитесь, удобнее).

Числа в Python представлены в памяти вашего компьютера в двоичном коде и могут занимать разный объем памяти. Важно понимать: чем больше число, тем больше времени занимают любые операции с ним и тем больше памяти вычислительной машины требуется.

С целыми числами можно производить любые арифметические операции без ограничений. Их имеется 7 разновидностей:
– сложение (+);
– вычитание (-);
– умножение (*);
– деление (/);
– возведение в степень (**);
– деление по модулю (%), которое возвращает целочисленный остаток от деления (т.е. если 3 % 2, то получим остаток 1);
– целочисленное деление (//), которое возвращает целочисленный результат деления без дробной части (т.е. если 10 // 4, то получим 2).

Читайте также

2
Two

Вопросы по теме "Целые числа"

1. Какая операция с целыми числами никогда не дает в виде результата целое число?
Простое деление всегда возвращает тип float, даже если деление не имеет дробного остатка (т.е. если разделить 4 / 2, то получим 2.0, а не 2).
2. Отличаются ли чем-то варианты объявления целого числа: 1230 или int(1230).
Ничем не отличаются. По факту, если мы пишем 10, то имеем в виду int(10).
*3. Перечислите все типы данных, которые потенциально можно преобразовать в целое число напрямую через функцию int().
К целым числам можно привести:
– целые числа: int(555) = 555;
– числа с плавающей точкой: int(-32.45) = -32;
– булевы значения: int(False) = 0;
– десятичные дроби: int(Decimal('17.7')) = 17;
– дробные числа: int(Fraction(10, 7)) = 1;
– строки: int('31') = 31.
3
Three

Задачи по теме "Целые числа"

4
Two

Решения

Задача 1. Базовый уровень

Условие
Обозначьте порядок вычисления выражения по операциям:
11 * 2 ** 2 – 13 / 4 + 7.
Какое целое число получим в итоге?
Сначала по приоритету возводим в степень (2 ** 2). Далее умножаем (11 * 4). Потом делим (13 / 4). Следом вычитаем (44 - 3.25). На последнем этапе применяем сложение (40.75 + 7). Получаем число с плавающей точкой 47.75. Если привести его к типу int, то результат равняется 47.
Решение - Интерактивный режим
>>> 11 * 2 ** 2 - 13 / 4 + 7
47.75

Задача 2. Базовый уровень

Условие
Сколько мегабайт памяти занимает число 3 ** 9090001? 
Для решения воспользуйтесь функцией getsizeof() из модуля sys.
Не торопитесь. Придется подождать около 10 секунд на вычисление выражения (в зависимости от мощности компьютера). Как известно, в одном килобайте – 1024 байт, а в одном мегабайте – 1024 Кб. Для вычисления объема занимаемой памяти воспользуемся функцией getsizeof() из модуля sys. Получим: sys.getsizeof(3 ** 9090001) / (1024 * 1024) = 1.83 Мб приблизительно.
Решение - IDE
# 1. Импортируем функцию из модуля
from sys import getsizeof
# 2. Находим объем занимаемом памяти в Мегабайтах
getsizeof(3 ** 9090001) / (1024 * 1024)
# Результат: 1.8319969177246094

Задача 3. Базовый уровень

Условие
Используя стандартные арифметические операции представьте самое большое целое число из цифр 4, 4, 4 и приведите его значение.
Операция возведения в степень дает невероятно большое число, значение которого больше, чем атомов в известной Вселенной.
Решение - Интерактивный режим
>>> 4 ** 4 ** 4
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096

Задача 4. Базовый уровень

Условие
Какие из представленных выражений можно преобразовать в целое десятичное число за одну операцию:
А) '123е';
Б) '91.4';
В) 524.345 ** 435345345311145345;
Г) '7.1 + 4';
Д) '4' - 2;
Е) '4 - 2';
Ж) '42'
З) -12.12?
Чтобы получить ответ, необходимо каждое из выражений мысленно обернуть в функцию int(). Делать это на практике не рекомендуется, так как на пункте «В» ваш ПК намертво повиснет.

А) Строку преобразовать нельзя, так как в ней есть буквенный символ, не имеющий численного представления в десятичной системе счисления.
Решение - Интерактивный режим
>>> int('123е')
# Получим ошибку ValueError
Б) Строку, имитирующую число с плавающей точкой к типу int преобразовать не получится.
Решение - Интерактивный режим
>>> int('91.4')
# Получим ошибку ValueError
В) Хоть число и имеет немыслимые размеры, при достаточном объеме памяти оно будет преобразовано к типу int;
Решение - Интерактивный режим
>>> int(524.345 ** 435345345311145345)
# Сначала вычисляется возведение в степень, а потом преобразование к целому числу 
Г) Это строка, которая неприводима к целому числу.
Решение - Интерактивный режим
>>> int('7.1 + 4')
# Получим ошибку ValueError 
Д, Е) Строку и число либо выражение внутри строки нельзя сделать целым числом.
Решение - Интерактивный режим
>>> int('4' - 2)
# Получим ошибку TypeError
>>> int('4 - 2')
# Получим ошибку ValueError
Ж) Если внутри строки имеются лишь числа, то Python без проблем сделает из них int
Решение - Интерактивный режим
>>> int('42')
42
З) Число с плавающей точкой преобразуется в целое методом отсечения дробного остатка.
Решение - Интерактивный режим
>>> int(-12.12)
-12
Следовательно, правильные ответы: В, Ж, З.

Задача 5. Базовый уровень

Условие
Напишите функцию pos_add(a, b), которая возвращает положительное значение сложения двух целых чисел.
Проверку на действительность аргументов производить не будем, т. к. в условии обозначено, что мы предоставляем только целые числа.

Оптимальный вариант – использовать встроенную функцию abs(), которая возвращает положительное число.
Решение - IDE
def pos_add(a, b):
   return abs(a + b)

# Тесты
print(pos_add(7, -3))
print(pos_add(7, -7))
print(pos_add(-2, -3))
Результат выполнения
4
0
5

Задача 6. Базовый уровень

Условие
Определите функцию foo(a), которая возвращает результат целочисленного и по модулю деления любого целого числа на -11.
Целочисленное деление – результат выполнения операции «//», а делению по модулю – операции «%». В Python имеется встроенная функция divmod(), принимающая число и делитель. Она возвращает пару чисел: результат целочисленного деления и остаток от деления. Нам уже предоставлен делитель «-11», поэтому результат следующий:
Решение - IDE
def foo(a):
   return divmod(a, -11)

# Тесты
print(foo(22))
print(foo(-77))
print(foo(1))
Результат выполнения
(-2, 0)
(7, 0)
(-1, -10)
Если вы не знакомы с функцией divmod(), то можно решить задачу так:
Решение - IDE
def foo(a):
   return a // -11, a % -11

# Тесты
print(foo(22))
print(foo(-77))
print(foo(1))
Результат выполнения
(-2, 0)
(7, 0)
(-1, -10)

Задача 7. *Продвинутый уровень

Условие
Напишите функцию num_sum(a), принимающую любое значение. 
Если это целое число, то возвратить сумму его чисел. 
В противном случае возвращается фраза «Это не целое число».
Для решения потребуется функция abs(), которая преобразует отрицательное число в положительное и проверка принадлежности аргумента к типу int.

Главная проблема – булевы значения, которые (о чем не все знают) принадлежат к классу int в Пайтоне. По условию задачи нам годятся только целые числа, а True или False ими не являются. Следует провести и эту проверку.
Решение - IDE
def num_sum(a):
   # 1. Определяем принадлежность значения 'a' к целому числу, но не к булеву типу
   if isinstance(a, int) and not isinstance(a, bool):
       # 2. Преобразуем число в положительное, а потом - строку
       a_to_str = str(abs(a))
       # 3. Задаем начальную сумму 0
       s = 0
       # 4. В цикле складываем все числа
       for i in a_to_str:
           s += int(i)
       return s
   return 'Это не целое число'

# Тесты
print(num_sum(-146))
print(num_sum('-11'))
print(num_sum(True))
Результат выполнения
11
Это не целое число
Это не целое число

Читайте также

Задача 8. *Продвинутый уровень

Условие
Дана последовательность случайных цифр любой длины и «волшебное» положительное число, больше нуля. 
Напишите функцию magic(), принимающую эти аргументы, и выясните, можно ли разделить сумму квадратов последовательности на «волшебное» число без остатка. 
В качестве ответа возвращается «Волшебство случается» в случае успеха или «Никакого волшебства», если разделить нельзя.
Так как размер последовательности не известен, в качестве «первого» параметра передаем *args, а также обязательный ключевой параметр k.

Остается найти сумму квадратов при помощи цикла, функции map() или спискового включения и определить, делится ли она без остатка на k.
Решение - IDE
def magic(*args, k):
   # 1. Начальная сумма равна нулю
   sq_sum = 0
   # 2. Складываем квадраты всех аргументов в цикле
   for i in args:
       sq_sum += i ** 2
   # 3. Определяем, равен ли остаток от деления sq_sum на k нулю
   if sq_sum % k == 0:
       return 'Волшебство случается'
   return 'Никакого волшебства'

# Тесты
print(magic(2, 5, 7, k=5))
print(magic(2, 5, 7, k=39))
print(magic(2, 5, 7, k=2))
Результат выполнения
Никакого волшебства
Волшебство случается
Волшебство случается
Как вам материал?

Читайте также