Условная проверка кратности трём в Python
Проверка кратности числа трём в Python
В программировании часто требуется определить, делится ли число на три без остатка. Эта задача решается с помощью условных операторов и арифметических выражений. Наиболее распространённый способ - использование оператора взятия остатка %. Однако существуют и другие подходы, каждый из которых применим в определённых ситуациях.
Как проверить кратность числа 3 с помощью оператора %?
Самый простой и эффективный метод - вычислить остаток от деления на 3. Если остаток равен нулю, число кратно трём.
number = 9
if number % 3 == 0:
print('Число', number, 'кратно 3')
else:
print('Число', number, 'не кратно 3')Python число кратное 3 (проверка кратности числа 3 в python)
Результат: Число 9 кратно 3
Пояснение: Оператор % возвращает остаток от деления. Для 9 % 3 получаем 0, условие истинно. Метод работает для любых целых чисел, включая отрицательные (-3 % 3 = 0).
Типичная ошибка: использование оператора / вместо %. Деление возвращает float, который может иметь погрешность. Проверка number / 3 == 0 неверна, так как результат деления не равен нулю.
Решение: всегда использовать % для проверки делимости.
Как определить кратность трём через целочисленное деление и умножение?
Можно проверить, восстанавливается ли исходное число после деления на 3 и обратного умножения.
number = 15
if number // 3 * 3 == number:
print('Число', number, 'кратно 3')
else:
print('Число', number, 'не кратно 3')
Результат: Число 15 кратно 3
Пояснение: Целочисленное деление // даёт целую часть. Затем умножение на 3 восстанавливает число, только если оно было кратно. Иначе результат будет меньше исходного.
Ошибка: забыть про целочисленное деление и использовать обычное /, что даст ошибку при сравнении с float.
Как использовать признак делимости на 3 (сумма цифр)?
Число кратно трём, если сумма его цифр делится на 3. Этот метод полезен для больших чисел, когда деление может быть затратным.
def sum_digits(n):
return sum(int(d) for d in str(abs(n)))
number = 123
if sum_digits(number) % 3 == 0:
print('Число', number, 'кратно 3')
else:
print('Число', number, 'не кратно 3')
Результат: Число 123 кратно 3 (1+2+3=6, 6%3=0)
Пояснение: Функция sum_digits сначала берёт абсолютное значение (для отрицательных), преобразует в строку, суммирует цифры. Затем проверяется остаток этой суммы.
Проблема: для очень больших чисел преобразование в строку может быть ресурсоёмким. Хотя признак делимости работает, на практике % быстрее.
Как реализовать рекурсивную проверку через сумму цифр?
Признак делимости можно применить рекурсивно: пока число не станет однозначным, вычисляем сумму цифр. Если в итоге получится 0, 3, 6 или 9, то исходное число кратно 3.
def recursive_sum(n):
n = abs(n)
while n > 9:
n = sum(int(d) for d in str(n))
return n
number = 372
result = recursive_sum(number)
if result in (0, 3, 6, 9):
print('Число', number, 'кратно 3')
else:
print('Число', number, 'не кратно 3')
Результат: Число 372 кратно 3 (3+7+2=12, 1+2=3)
Пояснение: Рекурсия останавливается, когда число становится меньше 10. Затем проверяется, является ли оно одним из значений, кратных 3. Этот способ полезен для обучения, но не для продакшена из-за накладных расходов.
Ошибка: бесконечный цикл, если не обработать отрицательные числа (abs решает). Также возможна ошибка для нуля: 0 % 3 == 0, и recursive_sum(0) = 0, условие верно.
Как использовать тернарный оператор для проверки?
Краткая запись с if else в одну строку.
number = 6
result = 'кратно' if number % 3 == 0 else 'не кратно'
print('Число', number, result)
Результат: Число 6 кратно
Пояснение: Тернарный оператор возвращает строку в зависимости от условия. Удобно для присваивания значения.
Дополнительные примеры использования проверки кратности трём
Приведены расширенные примеры, демонстрирующие различные сценарии.
import time
def method_percent(n):
return n % 3 == 0
def method_div_mult(n):
return n // 3 * 3 == n
def method_sum_digits(n):
return sum(int(d) for d in str(abs(n))) % 3 == 0
numbers = range(1, 1000001)
start = time.perf_counter()
for n in numbers:
method_percent(n)
print('Оператор %:', time.perf_counter() - start)
start = time.perf_counter()
for n in numbers:
method_div_mult(n)
print('// и *:', time.perf_counter() - start)
start = time.perf_counter()
for n in numbers:
method_sum_digits(n)
print('Сумма цифр:', time.perf_counter() - start)
Примерный вывод: Оператор %: 0.087 // и *: 0.097 Сумма цифр: 0.852
Пояснение: оператор % самый быстрый, метод с суммой цифр значительно медленнее из-за преобразований строк.
numbers = [1, 3, 4, 6, 8, 9, 12, 15, 18, 20]
multiples_of_three = [n for n in numbers if n % 3 == 0]
print(multiples_of_three)
[3, 6, 9, 12, 15, 18]
numbers = [2, 3, 5, 6, 9, 10]
result = list(filter(lambda x: x % 3 == 0, numbers))
print(result)
[3, 6, 9]
from math import isclose
def is_multiple_of_three_float(n):
# для float лучше проверять с допуском
quotient = n / 3
return isclose(quotient, round(quotient))
print(is_multiple_of_three_float(3.0))
print(is_multiple_of_three_float(3.1))
print(is_multiple_of_three_float(9.0000001))
True False False
Пояснение: из-за погрешности представления чисел с плавающей точкой прямая проверка остатка float % 3 может дать неточный результат. Используем isclose для сравнения.
card_number = '1234567890123456'
def check_by_digit_sum(s):
digit_sum = sum(int(ch) for ch in s if ch.isdigit())
return digit_sum % 3 == 0
print(check_by_digit_sum(card_number))
True или False в зависимости от суммы
def multiples_of_three(start=0):
n = start
while True:
if n % 3 == 0:
yield n
n += 1
gen = multiples_of_three()
first_ten = [next(gen) for _ in range(10)]
print(first_ten)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]