Ctrl+Enter
Ошибка или опечатка? Выдели её, нажми Ctrl+Enter и коротко опиши, что не так. Это сделает наши материалы лучше!
Ошибка или опечатка? Выдели её, нажми Ctrl+Enter и коротко опиши, что не так. Это сделает наши материалы лучше!
Чтобы дать возможность извлечь пользу из данного материала людям разного уровня, применяется специальный знак для обозначения материала, необходимого для виртуозов.
Когда этот знак появляется в начале раздела, это предупреждает читателя об "опасном повороте". Не читайте этот блок без необходимости. Для большинства приложений такие детали не имеют значения.
Некоторые блоки настолько экзотичны, что они оценены двумя знаками опасного поворота. Всё, что было сказано о простом знаке опасного поворота, для этих случаев подходит вдвойне. Вам, вероятно, потребуется месячный опыт работы с питоном, прежде чем вы попытаетесь проникнуть в такие дважды опасные глубины питона. В действительности большинству людей никогда не потребуется знать питон в таких подробностях, даже если они пользуются им ежедневно. В конце концов, можно водить машину, не зная, как работает мотор.
В предыдущем задании мы использовали Питон для простых разовых вычислений, используя интерактивный режим. Например, было задание вычислить длину гипотенузы прямоугольного треугольника по ее катетам. «Программа» эта выглядела так:
Неплохо для калькулятора, но совсем не универсально: если нужна другая гипотенуза, то нужно брать всё выражение и исправлять в нём отдельные числа. Эту программу можно написать по-другому:
Здесь мы используем переменные — бирки, которые можно повесить на различные (числовые, строковые и прочие) значения в памяти интерпретатора.
В первой строке переменной a
присваивается значение 179, затем переменной b
присваивается значение 971, затем
переменной c
присваивается значение выражения, равному длине гипотенузы.
И наконец в последней строчке мы выводим при помощи функции print
получившееся значение.
Программа, которая получилась, длиннее и сложнее, чем та первая, из «калькулятора».
Зачем эти сложности?
Плюс в том, что значения a
и b
в такой программе можно брать и не из её кода, а например из того, что пользователь ввёл на клавиатуре.
Получится удобный гипотенузный вычислятор: ты ему два числа, а он в ответ гипотенузу.
В питоне же всё, с чем можно работать — это объекты в памяти интерпретатора. А переменные — это бирки, которые к этим объектам привязаны.
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()
можно считать в переменную то, что будет введено с клавиатуры (это называется стандартный ввод).
После этого с этими данными можно выполнять различные манипуляции, например, просто вывести:
from_user = input() print(from_user)
Считайте строку и выведите её же, но повторённой два раза (без лишних пробелов).
Hello
HelloHello
А ну-ка повтори!
А ну-ка повтори!А ну-ка повтори!
Функция input()
всегда возвращает строку.
Но строку при необходимости можно превратить в число!
На вход даётся число. Считайте его и выведите следующее.
1
2
179
180
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
и выведем результат на экран.
Теперь мы можем не меняя исходного кода программы многократно использовать ее для решения различных задач.
Даны два числа a и b. Выведите гипотенузу треугольника с заданными катетами.
В этой задаче необходимо прочитать два числа при помощи int(input())
.
Вычислить гипотенузу.
И вывести получившееся число при помощи функции print
.
3 4
5.0
1 1
1.4142135623730951
Для целых чисел определены ранее рассматривавшиеся операции
+
, -
, *
и **
. Операция
деления /
для целых чисел возвращает значение типа float
.
Также функция возведения в степень возвращает значение типа float
,
если показатель степени — отрицательное число.
Но есть и специальная операция целочисленного деления, выполняющегося с отбрасыванием
дробной части, которая обозначается //
. Она возвращает целое число: целую
часть частного. Например:
>>> 17 // 3 5 >>> -17 // 3 -6
Другая близкая ей операция: это операция взятия остатка от деления, обозначаемая
%
:
>>> 17 % 3 2 >>> -17 % 3 1
$n$ школьников делят $k$ яблок поровну, неделяющийся остаток остается в корзинке. Сколько яблок достанется каждому школьнику? Сколько яблок останется в корзинке? Программа получает на вход числа $n$ и $k$ и должна вывести два числа: количество яблок у каждого школьника и количество яблок, оставшихся в корзинке.
3 14
4 2
+, -, *, //, %, **, str, int
.+, -, *, //, %, **
.
Нужно придумать решения без использования циклов и без использования ветвлений (if
).
Часто оказывается, что такое целочисленное решение короче, проще и быстрее.
Если вы уже знакомы с программированием на Python или просто очень... мотивированы, то можно сдавать задачи на Javascript и/или C++. Ниже пример программы, которая считывает строку и число, затем выводит её повторённой столько раз.
s = input() x = int(input()) print(s * x)
const rows = require('fs').readFileSync(0).toString().split('\n').reverse(); const input = () => rows.pop(); const s = input(); const x = parseInt(input()); console.log(s.repeat(x));
#include < iostream > #include < string > using namespace std; int main() { string s; int x; getline(cin, s); cin >> x; for(int i = 0; i < x; ++i) { cout << s; } cout << endl; return 0; }
В JavaScript нет встроенных функций, аналогичных функциям int()
и str()
в Python, но есть методы и операторы, которые можно использовать для аналогичных целей.
int()
в Python преобразует аргумент в целое число. В JavaScript для этого можно использовать оператор parseInt()
:
parseInt("123"); // 123
str()
в Python преобразует аргумент в строку. В JavaScript это можно сделать с помощью метода toString()
:
(123).toString(); // "123"
+
)5 + 2
→ 7
5 + 2
→ 7
-
)5 - 2
→ 3
5 - 2
→ 3
*
)5 * 2
→ 10
5 * 2
→ 10
/
)5 / 2
→ 2.5
5 / 2
→ 2.5
//
)5 // 2
→ 2
Math.floor(5 / 2); // 2
%
)5 % 2
→ 1
5 % 2
→ 1
Таким образом, основные операции и преобразования типов весьма схожи в Python и JavaScript, хотя и существуют некоторые различия в синтаксисе и доступных методах. Особенно осторожным нужно быть с целочисленным делением и остатками отрицательных чисел.
Феофилакт хочет купить ракетки и шарики для игры в настольный теннис. Один комплект ракеток стоит \(A\) рублей, один шарик стоит \(B\) рублей. У Феофилакта есть \(C\) рублей, \(C\ge A\), он покупает один комплект ракеток и шарики на оставшиеся деньги. Сколько шариков купит Феофилакт?
Программа получает на вход три числа: \(A\), \(B\), \(C\).
20 10 55
3
Дано двузначное число. Найдите число десятков в нем.
42
4
Обычно код читается намного больше раз, чем пишется. Чтобы разным людям было удобно читать код друг друга, были придуманы и зафиксированы рекомендации для оформления кода на Python. Они называются PEP 8 — Style Guide for Python Code. Там достаточно много рекомендаций, и многие из них требуют достаточно глубокого понимания питона. Начиная с задачи E будет проверяться стиль кода решений. Если что-то не так, то ваша программа будет получать вердикт «Coding style violation», а в отчёте о тестировании можно будет увидеть причину:
>Line 2: E225 missing whitespace around operator Поставьте пробелы вокруг оператора b =int(input()) ^
Можно пока не разбираться с правилами форматирования, а просто настроить автоматическое форматирование в PyCharm.
Для этого нужно открыть настройки (клик по шестерёнке или гамбургеру, затем — «Settings»), раскрыть меню «Tools», там найти «Actions on save»
и поставить галочку на «Reformat code».
Кликайте по картинке, чтобы увеличить:
Создайте новый файлик, вставьте в него этот код и сохраните. Если автоматическое форматирование настроено правильно, то код будет сразу переформатирован. Вот переформатированную версию и нужно сдать. Тест к этой задаче скрыт по понятным причинам :)
a= 2 +3 b =[2,3,4 , # Dich detected 5, 6 , 7] print( a, sep = '-', end = "baz") if True: if True :#WHAT? print ( (a, ) , b [ : 2 : 5 ] , sep= '+', end = '-')
Дано натуральное число. Выведите его последнюю цифру.
179
9
Дано натуральное число, не меньшее 10. Найдите число десятков в его десятичной записи (то есть предпоследнюю цифру его десятичной записи).
179
7
Наверное вы уже заметили, что очень часто приходится вводить одни и те же фрагменты кода, например, int(input())
.
PyCharm позволяет существенно ускорить ввод подобных повторяющихся фрагментов.
Для этого откройте настройки, откройте раздел «Editor», там найдите «Live Templates», в открывшемся справа окне нажмите «Python»:
теперь нажмите плюсик и выберите «Live Template».
В качестве Abbreviation введите ii
, а в качестве Description и Template Text — int(input())
.
Теперь нужно указать, где сокращение должно работать: внизу где «No applicable contexts» нажмите «Define» и поставьте галочку напротив питона.
Осталось всё сохранить. Теперь, когда вы вводите ii
в коде, будет появляться возможность заменить его на наш шаблон, для этого нужно нажать Tab.
Настройте сниппет ii
по инструкции выше.
Введите в коде ii
и сделайте скриншот, на котором отображается выпадающая подсказка.
Должно получиться что-то в таком духе:
Дано трехзначное число. Найдите сумму его цифр.
179
17
Из проволоки толщиной \(d\) миллиметров сделали кольца. Внутренний радиус каждого кольца составляет \(R\) миллиметров. Всего сделали \(n\) колец и их соединили в цепь. Определите длину получившейся цепи \(L\). На рисунке изображен пример для \(n = 3\).
Программа получает на вход числа \(d\), \(R\), \(n\), при этом \(d\lt R\), и должна вывести длину полученной цепи.
2 10 3
64
Дано число n. С начала суток прошло n минут. Определите, сколько часов и минут будут показывать электронные часы в этот момент. Программа должна вывести два числа: количество часов (от 0 до 23) и количество минут (от 0 до 59). Учтите, что число n может быть больше, чем количество минут в сутках.
150
2 30
1441
0 1
Пирожок в столовой стоит $a$ рублей и $b$ копеек. Определите, сколько рублей и копеек нужно заплатить за $n$ пирожков. Программа получает на вход три числа: $a$, $b$, $n$, и должна вывести два числа: стоимость покупки в рублях и копейках.
10 15 2
20 30
2 50 4
10 0
Ручка стоила \(K\) рублей. Первого сентября стоимость ручки увеличилась ровно на \(P\) процентов. Определите, сколько ручек можно купить на \(S\) рублей после подорожания.
Программа получает на вход три числа: \(K\), \(P\), \(S\).
Решите эту задачу полностью оставаясь в рамках целых чисел и целочисленного деления.
33 5 100
2
На каждой странице книги напечатано ровно \(k\) строк: на первой странице находятся строки с \(1\) по \(k\), на второй — c \(k+1\) по \(2k\) и т.д. Определите, на какой станице находится строка номер \(n\) и какой по счёту будет эта строка на странице.
Даны числа \(k\) и \(n\), нужно вывести два числа: номер страницы и номер строки на странице.
50 100
2 50
Длина Московской кольцевой автомобильной дороги —109 километров. Байкер Вася стартует с нулевого километра МКАД и едет со скоростью $v$ километров в час. На какой отметке он остановится через $t$ часов?
Программа получает на вход значение $v$ и $t$. Если $v>0$, то Вася движется в положительном направлении по МКАД, если же значение $v<0$, то в отрицательном.
Программа должна вывести целое число от 0 до 108 — номер отметки, на которой остановится Вася.
Скорее всего в вашей программе будет использоваться число 109.
Однако человек, который не читал условие задачи, вряд ли сможет понять, откуда взялось это число.
Таким образом, число 109 — это какая-то непонятная константа (их называют «магическими» и очень не любят).
Обычно их записывают в переменные — константы. В питоне их принято писать капсом:
MKAD_LEN = 109
.
Тогда читающий код может понять, почему именно 109.
В ваших программах не должно быть «магических» констант.
60 2
11
-1 1
108
Дано целое число n. Выведите следующее за ним четное число.
7
8
8
10
Шахматная доска состоит из \(n \times m\) клеток, покрашенных в черный и белый цвет в шахматном порядке. При этом клетка в левом нижнем углу доски покрашена в черный цвет. Определите, сколько всего на доске черных клеток.
Программа получает на вход числа \(n\) и \(m\).
3 4
6
В некоторой школе решили набрать три новых математических класса и оборудовать кабинеты для них новыми партами. За каждой партой может сидеть два учащихся. Известно количество учащихся в каждом из трех классов. Выведите наименьшее число парт, которое нужно приобрести для них.
Программа получает на вход три натуральных числа: количество учащихся в каждом из трех классов.
20 21 22
32
Напишите программу, которая считывает значения двух переменных a и b, затем меняет их значения местами (то есть в переменной a должно быть записано то, что раньше хранилось в b, а в переменной b записано то, что раньше хранилось в a). Затем выведите значения переменных.
3 7
7 3
Примечание. Решением задачи не является такой код:
a = input() b = input() print(b, a)
Примечание для знающих Питон — забудьте про существование кортежей. Используйте вспомогательную переменную.
Решите предыдущую задачу без использования дополнительной переменной (ну и без кортежных присваиваний, разумеется).
В некоторой школе занятия начинаются в 9:00. Продолжительность урока — 45 минут, после 1-го, 3-го, 5-го и т.д. уроков перемена 5 минут, а после 2-го, 4-го, 6-го и т.д. — 15 минут.
Дан номер урока (число от 1 до 10). Определите, когда заканчивается указанный урок. Выведите два целых числа: время окончания урока в часах и минутах.
3
11 35
2
10 35
За день машина проезжает $n$ километров. Сколько дней нужно, чтобы проехать маршут длиной $m$ километров?
Программа получает на вход числа $n$ и $m$.
700 750
2
700 2100
3
$n$ школьников делят $k$ яблок «поровну», то есть так, чтобы количество яблок, доставшихся любым двум школьникам, отличалось бы не более, чем на 1.
Программа получает на вход числа $n$ и $k$ и должна вывести количество школьников, которым достанется яблок меньше, чем некоторым из их товарищей.
7 30
5
7 28
0
Улитка ползет по вертикальному шесту высотой $h$ метров, поднимаясь за день на $a$ метров, а за ночь спускаясь на $b$ метров. На какой день улитка доползет до вершины шеста?
Программа получает на вход натуральные числа $h$, $a$, $b$, и должна вывести одно натуральное число. Гарантируется, что $a>b$.
10 3 2
8
Электронные часы показывают время в формате h:mm:ss
, то есть сначала записывается
количество часов, потом обязательно двузначное количество минут, затем обязательно двузначное количество секунд.
Количество минут и секунд при необходимости дополняются до двузначного числа нулями.
С начала суток прошло n секунд. Выведите, что покажут часы.
3602
1:00:02
129700
12:01:40
В часах села батарейка, и они стали идти вдвое медленнее. Когда на часах было \(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
Дано четырехзначное число. Определите, является ли его десятичная запись симметричной. Если число симметричное, то выведите 1, иначе выведите любое другое целое число. Число может иметь меньше четырех знаков, тогда нужно считать, что его десятичная запись дополняется слева незначащими нулями.
2002
1
2008
37
Даны два натуральных числа n и m. Если одно из них делится на другое нацело, выведите 1, иначе выведите любое другое целое число.
2 8
1
8 2
1
3 5
7
\(N\) человек разбили на \(M\) команд, в каждой команде есть хотя бы один человек. Все члены каждой команды обменялись рукопожатиями. Посчитайте минимальное и максимальное число возможных рукопожатий.
Программа получает на вход числа \(N\) и \(M\), \(1 \le M\le N\) и должна вывести два числа — минимальное и максимальное число рукопожатий.
4 2
2 3
Тесты к этой задаче закрытые.
В однокруговом турнире без ничьих участвовало N команд (каждая сыграла с каждой по одному матчу). Победителями считаются все команды, которые выиграли не меньше партий, чем остальные. Какое наибольшее количество победителей может быть в таком турнире?
Вводится одно натуральное число — количество команд.
Выведите одно число — наибольшее возможное количество победителей в таком турнире.
2
1
Тесты к этой задаче закрытые.
Напишите программу, которая считывает два целых числа $a$ и $b$ и выводит наибольшее значение из них. Числа — целые от 1 до 1000.
При решении задачи можно пользоваться только
целочисленными арифметическими операциями +
, -
,
*
, //
, %
, =
.
Нельзя пользоваться нелинейными конструкциями: ветвлениями, циклами, функциями.
8 5
8
5 8
8
5 5
5
Имеется $N$ кг металлического сплава. Из него изготавливают заготовки массой $K$ кг каждая. После этого из каждой заготовки вытачиваются детали массой $M$ кг каждая (из каждой заготовки вытачивают максимально возможное количество деталей). Если от заготовок после этого что-то остается, то этот материал возвращают к началу производственного цикла и сплавляют с тем, что осталось при изготовлении заготовок. Если того сплава, который получился, достаточно для изготовления хотя бы одной заготовки, то из него снова изготавливают заготовки, из них — детали и т.д.
Напишите программу, которая вычислит, какое количество деталей может быть получено по этой технологии из имеющихся исходно $N$ кг сплава.
Программа получает на вход три натуральных числа $N$, $K$, $M$.
Выведите одно число — количество деталей, которое может получиться по такой технологии.
10 5 2
4
13 5 3
3
14 5 3
4
13 9 4
2
Тесты к этой задаче закрытые.
Чтобы пройти все тесты, используйте решение одной из предыдущих задач.
Часовые пояса нумеруются величиной различия местного времени с временем UTC. В часовом поясе UTC\(+A\) местное время больше, чем время в часовом поясе UTC\(+0\) на \(A\) часов (если же \(A\lt 0\), то меньше на \(|A|\) часов).
Например, если в часовом поясе UTC\(+0\) часы показывают 12 часов, то в часовом поясе UTC\(+1\) в этот момент 13 часов, а в часовом поясе UTC\(-1\) — 11 часов.
Мы будем считать, что значение \(A\) — целое число от -11 до 12. То есть мы не будем рассматривать такие часовые пояса, как UTC\(+13\), время в которой отличается от UTC\(-11\) ровно на сутки.
Ваш друг прислал вам сообщение, что у него сейчас часы показывают \(H_1\) часов, \(0\le H_1\le23\). Вы посмотрели на свои часы и обнаружили, что они показывают \(H_2\) часов, \(0\le H_2\le23\). Вы находитесь в часовом пояcе UTC\(+A\), \(-11\le A\le 12\). Определите, в каком часовом поясе находится ваш друг.
Программа получает на вход числа \(H_1\), \(H_2\), \(A\) и должна вывести номер часового пояса друга: число от \(-11\) до \(12\).
23 2 1
-2
Тесты к этой задаче закрытые.
Как известно, длину Удава можно измерять Попугаями и Мартышками. Оказалось, что длина Удава равна \(n\) целым Попугаям (и, возможно, ещё какая-то дробная часть Попугая) или \(m\) целым Мартышкам (и, возможно, ещё какая-то дробная часть Мартышки). Определите, какая минимальная и максимальная возможная длина Мартышки в Попугаях.
Программа получает на вход два целых числа \(n\) и \(m\), каждое на своей строке — количество Попугаев и Мартышек в Удаве, соответственно.
Программа должна вывести два целых числа — минимальную и максимальную возможную длину одной Мартышки в Попугаях.
38 5
6 7
Тесты к этой задаче закрытые.