Подтема 4 из 7
Цифры и знак числа
Как проверить окончание, количество цифр и знак отрицательного числа — «оканчивается на 25» в задаче темы.
Окончание числа
В задаче темы порог — максимальный элемент, оканчивающийся на 25. Среди восьми чисел темы так оканчиваются 125, −325 и 2025. Как проверить окончание программой?
Две последние цифры числа — остаток от деления его модуля на 100: abs(x) % 100 == 25. У положительного числа модуль не нужен: 2025 = 20 · 100 + 25, и при делении на 100 в остатке остаются две последние цифры. Но у −325 остаток без модуля другой:
print(2025 % 100, -325 % 100, abs(-325) % 100)Почему −325 % 100 = 75? Python отсчитывает остаток от ближайшего кратного 100 слева, а для −325 это −400:
Поэтому окончание всегда проверяют у . Другие окончания проверяют так же — меняется только делитель:
- оканчивается на 3
abs(x) % 10 == 3- оканчивается на 25
abs(x) % 100 == 25- оканчивается на 123
abs(x) % 1000 == 123- последние цифры двух чисел совпадают
abs(x) % 10 == abs(y) % 10
Тонкости:окончание 07
Проверка abs(x) % 100 == 7 выполнена и для числа 7. Если нужна запись, которая кончается двумя символами 07, у числа должно быть хотя бы две цифры: abs(x) >= 10 and abs(x) % 100 == 7.
Где модуль не нужен
Значит, модуль нужен везде?
Нет: модуль нужен для цифр записи. Условие про остаток от деления проверяют у самого числа. «Остаток от деления числа на 5 равен 2» — это x % 5 == 2. Для −8 условие выполнено: −8 = (−2) · 5 + 2. А с модулем получится другой остаток:
print(-8 % 5, abs(-8) % 5)Проверка делимости тоже обходится без модуля: -1250 % 25 равно 0, и −1250 кратно 25.
Количество цифр
Как проверить, что число трёхзначное, пятизначное или двузначное?
Количество цифр проверяют границами модуля — так же, как четырёхзначные числа в задаче темы. Трёхзначное число по модулю лежит от 100 до 999, и −325 тоже трёхзначное:
- двузначное
10 <= abs(x) <= 99- трёхзначное
100 <= abs(x) <= 999- пятизначное
10000 <= abs(x) <= 99999- положительное трёхзначное
100 <= x <= 999- отрицательное трёхзначное
-999 <= x <= -100
Цифры можно посчитать и через текст: превращает число в строку, а len считает её символы. Но у отрицательного числа в строке есть минус:
print(len(str(-325)), len(str(abs(-325))))Границы короче и не ошибаются на минусе, поэтому в решениях берут их.
Цифра в разряде
А если нужна не последняя цифра, а предпоследняя или первая?
Сначала отбрасывают младшие цифры делением //, потом берут последнюю цифру того, что осталось. Для −325: модуль 325, 325 // 10 = 32, и последняя цифра 32 — 2. Это предпоследняя цифра −325. Первую цифру удобно взять из записи: str(m)[0] — первый символ строки.
m = abs(-325)print(m % 10, m // 10 % 10, str(m)[0])Условие «две последние цифры одинаковы» требует, чтобы цифр было хотя бы две: m >= 10 and m % 10 == m // 10 % 10. Без первой проверки подошло бы и число 5.
Знак числа
Как проверить «ровно одно число пары отрицательное»?
Ноль не положительный и не отрицательный, поэтому знак проверяют сравнением с нулём: x > 0, x < 0. «Ровно одно отрицательное» — количество из подтемы 3: int(x < 0) + int(y < 0) == 1. Пара (−8, 0) подходит: отрицательное в ней одно. А проверка x * y < 0 на ней не выполнена — произведение равно нулю:
x = -8y = 0print(int(x < 0) + int(y < 0) == 1, x * y < 0)x * y < 0 проверяет другое: одно число строго положительное, а другое строго отрицательное.
По знаку произведения трёх чисел нельзя судить и о том, одного ли они знака: у −2, −3, 5 произведение положительное. «Все одного знака» проверяют так: все три положительные или все три отрицательные — min(x, y, z) > 0 or max(x, y, z) < 0.
Итого
- Окончание
abs(x) % 100 == 25;-325 % 100равно 75 - Остатокбез модуля: «остаток от деления на 5 равен 2» —
x % 5 == 2 - Количество цифр
100 <= abs(x) <= 999 - Цифра в разрядепредпоследняя —
m // 10 % 10, первая —str(m)[0] - Знакноль ни положительный, ни отрицательный;
x * y < 0— разные знаки
Проверьте себя
Ответь сначала сам, потом открой ответ.
x % 100 == 25 без модуля?ОтветСкрыть ответ
-125 % 100 = 75, -1025 % 100 = 75.x = -9 верно ли условие «остаток от деления на 4 равен 3»? Что изменится, если ошибочно взять модуль?ОтветСкрыть ответ
-9 % 4 равно 3. С модулем получится abs(-9) % 4 = 1, и условие станет ложным.ОтветСкрыть ответ
ОтветСкрыть ответ
x * y < 0?ОтветСкрыть ответ
x * y < 0 — нет: произведение равно 0.Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Остаток отрицательного числа
Что выведет print(-23 % 10, abs(-23) % 10, -23 // 10)?
Введите через пробел три числа в том порядке, в каком их выведет программа.
Подсказка
Остаток отсчитывают от ближайшего кратного 10 слева: −23 = (−3) · 10 + 7.
Решение
−23 = (−3) · 10 + 7, поэтому остаток 7, а целая часть −3. Последняя цифра записи — остаток модуля: 3.
print(-23 % 10, abs(-23) % 10, -23 // 10)Ответ: 7 3 -3
Ровно одно оканчивается на 7
Последовательность 7, 12, 17, −7, 4. Найди количество соседних пар, где ровно одно число оканчивается на 7, и минимальную сумму квадратов таких пар.
Введите через пробел количество пар, затем минимальную сумму квадратов.
Подсказка
Окончание отрицательного числа проверяй у модуля; в ответе — наименьшая сумма квадратов.
Решение
Пара (17, −7) не подходит: на 7 оканчиваются оба числа.
a = [7, 12, 17, -7, 4]squares = []for i in range(len(a) - 1): x, y = a[i], a[i + 1] k = int(abs(x) % 10 == 7) + int(abs(y) % 10 == 7) if k == 1: squares.append(x ** 2 + y ** 2)print(len(squares), min(squares))Ответ: 3 65
Трёхзначные на 7 по модулю
Для файла 17-1.txt определите количество чисел, модуль которых — трёхзначное число, оканчивающееся на 7, затем — сколько из них отрицательных. В ответе запишите два числа.
Введите через пробел количество таких чисел, затем количество отрицательных среди них.
Подсказка
Количество цифр и последнюю цифру проверяй у abs(x), знак — у самого x.
Решение
100 <= abs(x) <= 999 and abs(x) % 10 == 7. Без модуля проверялась бы не та цифра: -113 % 10 равно 7.
with open("17-1.txt") as f: a = [int(x) for x in f]count = 0negative = 0for x in a: if 100 <= abs(x) <= 999 and abs(x) % 10 == 7: count += 1 if x < 0: negative += 1print(count, negative)Ответ: 37 17
Две одинаковые последние цифры
Для файла 17-1.txt определите количество чисел, в записи которых хотя бы две цифры и две последние цифры одинаковы.
Введите число.
Подсказка
Предпоследняя цифра — abs(x) // 10 % 10; у однозначного числа её нет.
Решение
m >= 10 and m % 10 == m // 10 % 10, где m = abs(x).
with open("17-1.txt") as f: a = [int(x) for x in f]count = 0for x in a: m = abs(x) if m >= 10 and m % 10 == m // 10 % 10: count += 1print(count)Ответ: 87
Ровно одно отрицательное
Последовательность −8, 0, 5, −3, 2. Найди количество соседних пар, где ровно одно число отрицательное, и максимальную сумму таких пар.
Введите через пробел количество пар, затем максимальную сумму.
Подсказка
Ноль не отрицательный: в паре (−8, 0) отрицательное число ровно одно.
Решение
Подходят (−8, 0), (5, −3) и (−3, 2); x * y < 0 пропустил бы пару с нулём.
a = [-8, 0, 5, -3, 2]sums = []for i in range(len(a) - 1): x, y = a[i], a[i + 1] if int(x < 0) + int(y < 0) == 1: sums.append(x + y)print(len(sums), max(sums))Ответ: 3 2