Целочисленная арифметика

Основные определения

Арифметический оператор (operator)

Специальный символ, выполняющий арифметические вычисления. В выражении a * b символ * — оператор умножения, a и b — его операнды.

Оператор, принимающий два операнда, называется бинарным. Унарный оператор принимает один операнд. Пример унарного оператора: -1.

Выражение (expression)

Последовательность операторов и операндов, результат вычисления которой сводится к единственному значению. Простейшие выражения состоят из одного значения и не содержат операторов: 42, "Hello, World!". Пример более сложного выражения: 2 ** 32 - 1.

Приоритет операций

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

Например, результат выражения 2 + 2 * 2 — 6, поскольку приоритет операции умножения выше, чем приоритет операции сложения. Изменить порядок вычислений в выражении можно с помощью скобок:

>>> (2 + 2) * 2
8
Ассоциативность

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

Различают правую (справа налево) и левую (слева направо) ассоциативность. Пример оператора с левой ассоциативностью — оператор деления /. Так, выражение 8 // 4 // 2 эквивалентно (8 // 4) // 2 и его результат равен 1.

Пример оператора с правой ассоциативностью — оператор возведения в степень:

>>> 2 ** 2 ** 3
256
>>> 2 ** (2 ** 3)
256
>>> (2 ** 2) ** 3
64

Арифметические операторы

В таблице приведены некоторые арифметические операторы языка Python в порядке уменьшения приоритета (операторы с наибольшим приоритетом расположены выше).

Операторы

Описание

Ассоциативность

(выражения...)

Круглые скобки

**

Возведение в степень

Справа налево

+x, -x

Унарные плюс и минус

*, /, //, %

Умножение, деление, целочисленное деление,
взятие остатка от деления

Слева направо

+, -

Сложение и вычитание

Целочисленное деление и взятие остатка от деления

Рассмотрим выражение \(7 / 2\). Частное можно записать в виде десятичной дроби: \(3.5\). Однако в ряде задач нам нужны отдельно целая часть и остаток от деления. Очевино, целая часть результата равна \(3\). Тогда для вычисления остатка от \(7\) нужно отнять произведение целой части на делимое, т.е. остаток равен \(7 - 3 \cdot 2\).

Такие операции поддерживаются в Python напрямую. Так, для целочисленного деления используется оператор //, а для получения остатка от деления оператор %:

>>> 7 // 2
3

>>> 7 % 2  # то же, что и 7 - (7 // 2 * 2)
1

Эти операции полезны при вычислениях с отдельными разрядами чисел.

Пусть дано число \(8192\), и нам необходимо получить его третий разряд, т.е. единицу. \(8192 // 10^2 \% 10 = 8192 // 100 \% 10 = 81 \% 10 = 1\).

Функции перевода чисел в различные системы счисления

bin(x)
oct(x)
hex(x)

Функции принимают целое число и возвращают его строковое представление в двоичной, восьмеричной и шестнадцатеричной системах счисления соответственно.

Пример:

>>> bin(255), oct(255), hex(255)
('0b11111111', '0o377', '0xff')

>>> bin(29), oct(29), hex(29)
('0b11101', '0o35', '0x1d')
int(x, base)

С этой функцией мы познакомились на прошлом занятии. Сейчас дополним, что вторым аргументом она может принимать основание системы счисления, в которой записано число x:

>>> int('101')
101
>>> int('101', 2)
5

Задачи

  1. Дано целое десятичное число. Выведите его последнюю цифру.

  2. Дано целое десятичное число. Найдите число десятков в его десятичной записи.

  3. Дано трехзначное число. Найдите сумму его цифр.

  4. Пирожок в столовой стоит \(a\) рублей и \(b\) копеек. Определите, сколько рублей и копеек нужно заплатить за \(n\) пирожков.

    Приложение запрашивает у пользователя стоимость одного пирожка и количество пирожков. Пример:

    Введите стоимость одного пирожка.
    Рубли: 2
    Копейки: 60
    Количество пирожков: 3
    

    Приложение должно вычислить стоимость запрошенного количества пирожков. Пример вывода:

    Сумма заказа: 7 рублей 80 копеек
    
  5. Дано число \(n\). С начала суток прошло n минут. Определите, сколько часов и минут будут показывать электронные часы в этот момент. Программа должна вывести два числа: количество часов (от 0 до 23) и количество минут (от 0 до 59). Учтите, что число \(n\) может быть больше, чем количество минут в сутках.

Дополнительные задачи

  1. В школе решили набрать три новых математических класса. Так как занятия по математике у них проходят в одно и то же время, было решено выделить кабинет для каждого класса и купить в них новые парты. За каждой партой может сидеть не больше двух учеников. Известно количество учащихся в каждом из трёх классов. Сколько всего нужно закупить парт чтобы их хватило на всех учеников? Программа получает на вход три целых десятичных числа: количество учащихся в каждом из трех классов.

  2. Обувная фабрика собирается начать выпуск элитной модели ботинок. Дырочки для шнуровки будут расположены в два ряда, расстояние между рядами равно \(a\), а расстояние между дырочками в ряду \(b\). Количество дырочек в каждом ряду равно \(N\). Шнуровка должна происходить элитным способом «наверх, по горизонтали в другой ряд, наверх, по горизонтали и т.д.» (см. рисунок). Кроме того, чтобы шнурки можно было завязать элитным бантиком, длина свободного конца шнурка должна быть \(l\). Какова должна быть длина шнурка для этих ботинок?

    Программа получает на вход четыре натуральных числа \(a\), \(b\), \(l\) и \(N\) и должна вывести одно число — искомую длину шнурка.

    ../_images/shoelaces.gif

3. Занятия в школе начинаются в 9:00. Продолжительность урока — 45 минут, перемены - 10 минут. На вход принимается номер урока, а выводится время, в которое он заканчивается (часы и минуты отдельно). Пример вывода:

Урок №2 заканчивается в 10 часов 40 минут

4. Доработайте код задачи № 3 таким образом, чтобы он запрашивал время начала занятий (минуты и часы отдельно) и номер урока, а далее также рассчитывал время окончания уроков.

5. Пользователь вводит число и систему счисления этого числа. Программа переводит число в десятичную, двоичную, восьмеричную и шестнадцетеричную системы счисления с использованием стандартных функций. Пример вывода:

Введите число: 01100010
Укажите систему счисления: 2
Число в десятичной системе счисления: 98
Число в двоичной системе счисления: 0b1100010
Число в восьмеричной системе счисления: 0o142
Число в шестнадцатеричной системе счисления: 0x62

Домашнее задание

  1. Дано трехзначное число. Найти произведение его цифр.

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

  3. Дано целое число \(n\). Выведите следующее за ним четное число.