Условная проверка кратности трём в 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]

Проверка кратности числа 3 в Python - comments

En
Python число кратное 3 (python)