Проверка делимости чисел нацело в Python
Проверка кратности в Python
Проверка кратности (делимости нацело) – одна из базовых задач, решаемых с помощью условных операторов. В Python для этого используется оператор %, возвращающий остаток от деления. Если остаток равен нулю, то первое число кратно второму.
Как проверить, делится ли одно число на другое без остатка?
Самый простой и эффективный способ – применить оператор взятия остатка % в условной конструкции.
a = 12
b = 4
if a % b == 0:
print(f"{a} кратно {b}")
else:
print(f"{a} не кратно {b}")кратен python (проверка кратности в python)
12 кратно 4
- Вычисляется остаток от деления a на b.
- Сравнивается с нулём.
- Выводится соответствующий результат.
Типичная ошибка: деление на ноль.
Если b = 0, возникнет исключение ZeroDivisionError. Перед проверкой кратности рекомендуется явно убедиться, что делитель не равен нулю:
if b != 0 and a % b == 0:
print("Кратно")
Как проверить чётность числа (кратность двум)?
num = 7
if num % 2 == 0:
print("Чётное")
else:
print("Нечётное")
Для отрицательных чисел оператор % в Python возвращает остаток того же знака, что и делитель. Поэтому -3 % 2 равно 1 (а не -1). Это не влияет на проверку чётности, так как результат сравнивается с нулём.
Как проверить кратность трём и пяти (задача FizzBuzz)?
Обычно требуется вывести разные сообщения в зависимости от кратности 3, 5 или обоим числам.
n = 15
if n % 15 == 0:
print("FizzBuzz")
elif n % 3 == 0:
print("Fizz")
elif n % 5 == 0:
print("Buzz")
else:
print(n)
FizzBuzz
Порядок проверки важен: сначала проверяется кратность 15 (3 и 5 одновременно), иначе для числа 15 было бы выведено только "Fizz".
Как использовать divmod для проверки кратности?
Встроенная функция divmod возвращает частное и остаток. Можно взять остаток и сравнить с нулём.
a, b = 20, 6
_, remainder = divmod(a, b)
if remainder == 0:
print("Кратно")
else:
print("Не кратно")
Этот вариант избыточен и менее производителен, чем прямой оператор %, так как вычисляется и частное, и остаток.
Как проверить кратность нескольким числам одновременно (все делители)?
Функция all позволяет проверить, что число делится на каждый из списка делителей.
number = 30
divisors = [2, 3, 5]
if all(number % d == 0 for d in divisors):
print("Кратно всем")
else:
print("Не кратно хотя бы одному")
Если в списке есть ноль, получим ошибку деления на ноль. Необходимо предварительно удалить ноль из divisors или обработать отдельно.
Как проверить кратность с помощью целочисленного деления?
Можно умножить результат целочисленного деления на делитель и сравнить с исходным числом:
a, b = 18, 4
if a // b * b == a:
print("Кратно")
else:
print("Не кратно")
Этот способ эквивалентен a % b == 0, но менее читаем и может работать медленнее из-за двух операций (деление и умножение).
Как проверить кратность с вещественными числами?
Плавающая арифметика неточна, поэтому прямое сравнение остатка с нулём может не сработать. Рекомендуется использовать math.isclose из модуля math или округление.
import math
a = 10.0
b = 3.0
remainder = a % b
if math.isclose(remainder, 0.0, rel_tol=1e-9):
print("Почти кратно")
else:
print("Не кратно")
Из-за погрешностей 10 % 3 может дать 1.0, а не 0.0, поэтому использование вещественных чисел для проверки кратности обычно не рекомендуется. Лучше работать с целыми числами.
Расширенные примеры проверки кратности
Генерация чисел, кратных заданному значению
Функция, возвращающая список всех кратных чисел в заданном диапазоне:
def multiples(base, limit):
return [x for x in range(base, limit+1, base)]
print(multiples(7, 50))
[7, 14, 21, 28, 35, 42, 49]
Фильтрация кратных чисел из списка
Использование встроенной функции filter для отбора элементов, кратных 3:
data = [1, 3, 4, 9, 12, 15, 20]
result = list(filter(lambda x: x % 3 == 0, data))
print(result)
[3, 9, 12, 15]
Проверка года на високосность (комбинированная кратность)
Год високосный, если кратен 400, или кратен 4 и не кратен 100.
def is_leap(year):
return year % 400 == 0 or (year % 4 == 0 and year % 100 != 0)
for y in [1900, 2000, 2024, 2025]:
print(f"{y}: {is_leap(y)}")
1900: False 2000: True 2024: True 2025: False
Проверка кратности всех элементов списка одному числу
Определение, делятся ли все элементы из nums на k без остатка:
nums = [10, 20, 30, 40]
k = 10
all_divisible = all(num % k == 0 for num in nums)
print(all_divisible)
True
Поиск первого числа в последовательности, кратного заданному
Цикл while с проверкой:
start = 5
step = 3
limit = 100
while start <= limit:
if start % 7 == 0:
print(f"Найдено: {start}")
break
start += step
else:
print("Ничего не найдено")
Найдено: 14
Простая реализация алгоритма Евклида (НОД) с использованием кратности
При нахождении наибольшего общего делителя проверяется остаток от деления.
def gcd(a, b):
while b:
a, b = b, a % b
return a
print(gcd(48, 18))
6
Проверка кратности с помощью тернарного оператора для компактности
x = 10
y = 5
result = "кратно" if x % y == 0 else "не кратно"
print(result)
кратно
Условный вывод для каждого элемента кортежа (кратные 2 и 3)
numbers = (2, 3, 4, 6, 9, 12, 15)
for n in numbers:
if n % 2 == 0 and n % 3 == 0:
print(f"{n}: кратно 2 и 3")
elif n % 2 == 0:
print(f"{n}: кратно 2")
elif n % 3 == 0:
print(f"{n}: кратно 3")
else:
print(f"{n}: не кратно ни 2, ни 3")
2: кратно 2 3: кратно 3 4: кратно 2 6: кратно 2 и 3 9: кратно 3 12: кратно 2 и 3 15: кратно 3