Ctrl+Enter

Ошибка или опечатка? Выдели её, нажми Ctrl+Enter и коротко опиши, что не так. Это сделает наши материалы лучше!

Опасный поворот

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

Когда этот знак появляется в начале раздела, это предупреждает читателя об "опасном повороте". Не читайте этот блок без необходимости. Для большинства приложений такие детали не имеют значения.

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

Пишем простейшие программы

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

Запустите PyCharm, создайте новый проект, если вы ещё не сделали этого ранее. Для создания временного файла нажмите Ctrl+Alt+Shift+Insert (или ⇧⌘N в OS X). Для создания программы в проекте нажмите правую кнопку мыши на его имени в окне проектов слева, выберите New... Python file (только не называйте вашу программу test***).
Либо запустите Wing IDE, создайте новый файл.
Напишите следующий текст:

a = 179
b = 971
c = (a ** 2 + b ** 2) ** 0.5
print(c)

Здесь мы используем переменные — бирки, которые можно повесить на различные (числовые, строковые и прочие) значения в памяти интерпретатора. В первой строке переменной a присваивается значение 179, затем переменной b присваивается значение 971, затем переменной c присваивается значение арифметического выражения, равному длине гипотенузы.

После этого значение переменной c выводится на экран.

Сохраните этот текст, затем запустите эту программу
(в PyCharm: Ctrl+Shift+F10 или (или ^⇧F10 в OS X))
(в Wing IDE: Ctrl+Alt+V, или зелёный треугольник, или Source-Evaluate File in Python shell).

Интерпретатор языка Питон выполняет ту последовательность команд, которая сохранена в файле. При этом значения вычисленных выражений не выводятся на экран (в отличии от интерактивного режима), поэтому для того, чтобы вывести результат работы программы, то есть значение переменной c, нам понадобится специальная функция print.

Переменные в питоне

В питоне же всё, с чем можно работать — это объекты в памяти интерпретатора. А переменные — это бирки, которые к этим объектам привязаны.

a = 1
a = 2
b = a

Некоторые объекты уже созданы заранее (например, объекты-целые числа от -5 до 255). Другие объекты создаются во время исполнения программы. После того, как объект создан, он живёт независимо от конкретных переменных, на него ссылающихся. Если на объект не ссылается ни одна переменная, то он со временем удаляется из памяти.

Проверка того, ссылаются ли две переменных на один и тот же объект, выполняется при помощи команды is.

Непонятные примеры

Вот несколько примеров объектов и проверок на их совпадение.

>>> a = 123
>>> b = 123
>>> a is b
True

>>> b = 2
>>> a is b
False

>>> a = 321
>>> b = 320 + 1
>>> a is b
False
>>> a == b
True
Вполне может быть, что будут существовать два объекта типа число с одним и тем же значением. Так всегда происходит, когда проверить, не создавал ли кто-нибудь ранее точно такой же объект, сложнее, чем создать заново новый. Поэтому нельзя сравнивать переменные при помощи is.

Ввод данных: функция input()

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

a = input()
b = input()

Правда, функция input возвращает текстовую строку, а нам нужно сделать так, чтобы переменные имели целочисленные значения. Поэтому сразу же после считывания выполним преобразование типов при помощи фунцкии int, и запишем новые значения в переменные a и b.

a = int(a)
b = int(b)

Можно объединить считывание строк и преобразование типов, если вызывать функцию int для того значения, которое вернет функция input:

a = int(input())
b = int(input())

Далее в программе вычислим значение переменной c и выведем результат на экран.

Теперь мы можем не меняя исходного кода программы многократно использовать ее для решения различных задач. Для того нужно запустить программу и после запуска программы ввести с клавиатуры два числа, нажимая после каждого числа клавишу Enter. Затем программа сама выведет результат.

A: Гипотенуза

Даны два числа a и b. Выведите гипотенузу треугольника с заданными катетами.

В этой задаче необходимо прочитать два числа при помощи int(input()). Вычислить гипотенузу. И вывести получившееся число при помощи функции print.

3 4
5.0
1 1
1.4142135623730951
Тестирующая система.

B: Дележ яблок

$n$ школьников делят $k$ яблок поровну, неделяющийся остаток остается в корзинке. Сколько яблок достанется каждому школьнику? Сколько яблок останется в корзинке? Программа получает на вход числа $n$ и $k$ и должна вывести два числа: количество яблок у каждого школьника и количество яблок, оставшихся в корзинке.

3 14
4 2

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

Для целых чисел определены ранее рассматривавшиеся операции +, -, * и **. Операция деления / для целых чисел возвращает значение типа float. Также функция возведения в степень возвращает значение типа float, если показатель степени — отрицательное число.

Но есть и специальная операция целочисленного деления, выполняющегося с отбрасыванием дробной части, которая обозначается //. Она возвращает целое число: целую часть частного. Например:

>>> 17 // 3
5
>>> -17 // 3
-6

Другая близкая ей операция: это операция взятия остатка от деления, обозначаемая %:

>>> 17 % 3
2
>>> -17 % 3
1

Только +, -, *, //, %, **, str, int.

Все задачи в этом листке решаются с использованием только лишь целочисленных арифметических операций +, -, *, //, %, **. Нужно придумать решения без использования циклов и без использования ветвлений (if). Часто оказывается, что такое целочисленное решение короче, проще и быстрее.

C: Настольный тенниc

Феофилакт хочет купить ракетки и шарики для игры в настольный теннис. Один комплект ракеток стоит \(A\) рублей, один шарик стоит \(B\) рублей. У Феофилакта есть \(C\) рублей, \(C\ge A\), он покупает один комплект ракеток и шарики на оставшиеся деньги. Сколько шариков купит Феофилакт?

Программа получает на вход три числа: \(A\), \(B\), \(C\).

20 10 55
3

D: Число десятков двузначного числа

Дано двузначное число. Найдите число десятков в нем.

42
4

E: Последняя цифра

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

179
9

F: Предпоследняя цифра

Дано натуральное число, не меньшее 10. Найдите число десятков в его десятичной записи (то есть предпоследнюю цифру его десятичной записи).

179
7

G: Сумма цифр

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

179
17

H: Цепь

Из проволоки толщиной \(d\) миллиметров сделали кольца. Внутренний радиус каждого кольца составляет \(R\) миллиметров. Всего сделали \(n\) колец и их соединили в цепь. Определите длину получившейся цепи \(L\). На рисунке изображен пример для \(n = 3\). chain

Программа получает на вход числа \(d\), \(R\), \(n\), при этом \(d\lt R\), и должна вывести длину полученной цепи.

2 10 3
64

I: Электронные часы - 1

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

150
2 30
1441
0 1

J: Стоимость покупки

Пирожок в столовой стоит $a$ рублей и $b$ копеек. Определите, сколько рублей и копеек нужно заплатить за $n$ пирожков. Программа получает на вход три числа: $a$, $b$, $n$, и должна вывести два числа: стоимость покупки в рублях и копейках.

10 15 2
20 30
2 50 4
10 0

K: Инфляция

Ручка стоила \(K\) рублей. Первого сентября стоимость ручки увеличилась ровно на \(P\) процентов. Определите, сколько ручек можно купить на \(S\) рублей после подорожания.

Программа получает на вход три числа: \(K\), \(P\), \(S\).

Решите эту задачу полностью оставаясь в рамках целых чисел и целочисленного деления.

33 5 100
2
Пояснение к примеру. После подорожания ручка стала стоить 34 рубля 65 копеек. На 100 рублей можно купить 2 ручки.

L: Страницы книги

На каждой странице книги напечатано ровно \(k\) строк: на первой странице находятся строки с \(1\) по \(k\), на второй — c \(k+1\) по \(2k\) и т.д. Определите, на какой станице находится строка номер \(n\) и какой по счёту будет эта строка на странице.

Даны числа \(k\) и \(n\), нужно вывести два числа: номер страницы и номер строки на странице.

50 100
2 50

M: МКАД

Длина Московской кольцевой автомобильной дороги —109 километров. Байкер Вася стартует с нулевого километра МКАД и едет со скоростью $v$ километров в час. На какой отметке он остановится через $t$ часов?

Программа получает на вход значение $v$ и $t$. Если $v>0$, то Вася движется в положительном направлении по МКАД, если же значение $v<0$, то в отрицательном.

Программа должна вывести целое число от 0 до 108 — номер отметки, на которой остановится Вася.

Скорее всего в вашей программе будет использоваться число 109. Однако человек, который не читал условие задачи, вряд ли сможет понять, откуда взялось это число. Таким образом, число 109 — это какая-то непонятная константа (их называют «магическими» и очень не любят). Обычно их записывают в переменные — константы. В питоне их принято писать капсом: MKAD_LEN = 109. Тогда читающий код может понять, почему именно 109. В ваших программах не должно быть «магических» констант.

60 2
11
-1 1
108

N: Следующее четное

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

7
8
8
10

O: Шахматная доска

Шахматная доска состоит из \(n \times m\) клеток, покрашенных в черный и белый цвет в шахматном порядке. При этом клетка в левом нижнем углу доски покрашена в черный цвет. Определите, сколько всего на доске черных клеток.

Программа получает на вход числа \(n\) и \(m\).

3 4
6

P: Парты

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

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

20 21 22
32

Q: Обмен значений - 1

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

3 7
7 3

Примечание. Решением задачи не является такой код:

a = input()
b = input()
print(b, a)

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

R: Обмен значений - 2

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

★★
...при помощи битовых операций (без арифметических вовсе).
★★★
И объясните в комментариях, почему битовый обмен работает.

S: Конец уроков

В некоторой школе занятия начинаются в 9:00. Продолжительность урока — 45 минут, после 1-го, 3-го, 5-го и т.д. уроков перемена 5 минут, а после 2-го, 4-го, 6-го и т.д. — 15 минут.

Дан номер урока (число от 1 до 10). Определите, когда заканчивается указанный урок. Выведите два целых числа: время окончания урока в часах и минутах.

3
11 35
2
10 35

T: Автопробег

За день машина проезжает $n$ километров. Сколько дней нужно, чтобы проехать маршут длиной $m$ километров?

Программа получает на вход числа $n$ и $m$.

700 750
2
700 2100
3

U: Дележ яблок - 2

$n$ школьников делят $k$ яблок «поровну», то есть так, чтобы количество яблок, доставшихся любым двум школьникам, отличалось бы не более, чем на 1.

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

7 30
5
7 28
0

V: Улитка

Улитка ползет по вертикальному шесту высотой $h$ метров, поднимаясь за день на $a$ метров, а за ночь спускаясь на $b$ метров. На какой день улитка доползет до вершины шеста?

Программа получает на вход натуральные числа $h$, $a$, $b$, и должна вывести одно натуральное число. Гарантируется, что $a>b$.

10 3 2
8

W: Электронные часы - 2

Электронные часы показывают время в формате h:mm:ss, то есть сначала записывается количество часов, потом обязательно двузначное количество минут, затем обязательно двузначное количество секунд. Количество минут и секунд при необходимости дополняются до двузначного числа нулями.

С начала суток прошло n секунд. Выведите, что покажут часы.

3602
1:00:02
129700
12:01:40

X: Электронные часы - 3

В часах села батарейка, и они стали идти вдвое медленнее. Когда на часах было \(x_1\) часов \(y_1\) минут, правильное время было \(a_1\) часов \(b_1\) минут. Сколько времени будет на самом деле, когда часы в следующий раз покажут \(x_2\) часов \(y_2\) минут?

Программа получает на вход числа \(x_1\), \(y_1\), \(a_1\), \(b_1\), \(x_2\), \(y_2\) в указанном порядке. Все числа целые. Числа \(x_1\), \(a_1\), \(x_2\) — от 0 до 23, числа \(y_1\), \(b_1\), \(y_2\) — от 0 до 59.

Выведите два числа \(a_2\) и \(b_2\), определяющие сколько будет времени на самом деле, когда на часах будет \(x_2\) часов \(y_2\) минут.

12 34 10 34 12 35
10 36
12 34 10 0 2 34
14 0

Y: Симметричное число

Дано четырехзначное число. Определите, является ли его десятичная запись симметричной. Если число симметричное, то выведите 1, иначе выведите любое другое целое число. Число может иметь меньше четырех знаков, тогда нужно считать, что его десятичная запись дополняется слева незначащими нулями.

2002
1
2008
37
Сделайте это не более, чем за 7 арифметических операций.
★★
Сделайте это не более, чем за 5 арифметических операций.
★★★
Сделайте это не более, чем за 3 арифметических операции.

Z: Проверьте делимость

Даны два натуральных числа n и m. Если одно из них делится на другое нацело, выведите 1, иначе выведите любое другое целое число.

2 8
1
8 2
1
3 5
7

ZA★: Рукопожатия

\(N\) человек разбили на \(M\) команд, в каждой команде есть хотя бы один человек. Все члены каждой команды обменялись рукопожатиями. Посчитайте минимальное и максимальное число возможных рукопожатий.

Программа получает на вход числа \(N\) и \(M\), \(1 \le M\le N\) и должна вывести два числа — минимальное и максимальное число рукопожатий.

4 2
2 3

Тесты к этой задаче закрытые.

ZB: Турнир

В однокруговом турнире без ничьих участвовало N команд (каждая сыграла с каждой по одному матчу). Победителями считаются все команды, которые выиграли не меньше партий, чем остальные. Какое наибольшее количество победителей может быть в таком турнире?

Вводится одно натуральное число — количество команд.

Выведите одно число — наибольшее возможное количество победителей в таком турнире.

2
1

Тесты к этой задаче закрытые.

ZC★: Максимум

Напишите программу, которая считывает два целых числа $a$ и $b$ и выводит наибольшее значение из них. Числа — целые от 1 до 1000.

При решении задачи можно пользоваться только целочисленными арифметическими операциями +, -, *, //, %, =. Нельзя пользоваться нелинейными конструкциями: ветвлениями, циклами, функциями.

8 5
8
5 8
8
5 5
5

ZD★★: Детали

Имеется $N$ кг металлического сплава. Из него изготавливают заготовки массой $K$ кг каждая. После этого из каждой заготовки вытачиваются детали массой $M$ кг каждая (из каждой заготовки вытачивают максимально возможное количество деталей). Если от заготовок после этого что-то остается, то этот материал возвращают к началу производственного цикла и сплавляют с тем, что осталось при изготовлении заготовок. Если того сплава, который получился, достаточно для изготовления хотя бы одной заготовки, то из него снова изготавливают заготовки, из них — детали и т.д.

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

Программа получает на вход три натуральных числа $N$, $K$, $M$.

Выведите одно число — количество деталей, которое может получиться по такой технологии.

10 5 2
4
13 5 3
3
14 5 3
4
13 9 4
2

Тесты к этой задаче закрытые.