Разбор задачи Вася и приметы из Яндекс Учебника: проверка сумм цифр на делимость на три

Разбираем хитрую задачу про Васю, где математика встречается с логикой. Узнайте, как цифры и приметы раскрывают секрет!

В данной статье мы подробно разбереть популярную задачу по программированию и логике‚ которая встречается в Яндекс Учебнике (часто в модулях по Python‚ C++ или алгоритмизации для начинающих). Задача замаскирована под забавную историю о школьнике Васе‚ но по сути проверяет понимание работы с цифрами числа‚ оператором остатка от деления и логическими условиями.


📖 Условие задачи

Вася любит математику и верит в приметы‚ которые сам же и придумывает. Когда он видит номер машины или квартиры из трёх цифр‚ он складывает цифры попарно (a+b‚ b+c‚ a+c). Если хотя бы одна сумма делится на три‚ Вася загадывает желание.

Даны три числа (цифры). Загадает ли Вася желание? Выведи «да» или «нет».

Примеры ввода и вывода:

Ввод Пояснение
2 2 2 нет Суммы: 2+2=4‚ 2+2=4‚ 2+2=4. Ни одна не делится на 3.
1 2 3 да Суммы: 1+2=3 (делится на 3)‚ 2+3=5‚ 1+3=4. Условие выполнено.

🧠 Математический анализ и логика решения

На первый взгляд‚ задача требует просто перебрать три пары и проверить условие (a+b)%3 == 0 или (b+c)%3 == 0 или (a+c)%3 == 0. Это абсолютно верное и рабочее решение («в лоб»).

Однако‚ в олимпиадном программировании и на собеседованиях часто ценят оптимизацию и понимание свойств чисел. Давайте посмотрим‚ можно ли упростить условие.

Свойство делимости суммы на 3

Сумма двух чисел (x + y) делится на 3 в двух случаях:

  1. Оба числа дают одинаковый остаток от деления на 3‚ и этот остаток равен 0 (т.е. оба делятся на 3).
  2. Остатки от деления на 3 в сумме дают 3 (то есть 1 и 2).

Рассмотрим остатки наших цифр a‚ b‚ c от деления на 3. Каждая цифра может иметь остаток 0‚ 1 или 2.

Ключевое наблюдение (Принцип Дирихле)

У нас есть 3 цифры и всего 3 возможных остатка (0‚ 1‚ 2).

  • Случай 1: Среди остатков есть пара (1 и 2). Их сумма делится на 3. Ответ «да».
  • Случай 2: Есть хотя бы два нуля (остаток 0). Сумма двух чисел‚ делящихся на 3‚ делится на 3. Ответ «да».
  • Случай 3: Все три остатка одинаковы и не равны 0 (все 1 или все 2). Сумма любых двух: 1+1=2 (не делится)‚ 2+2=4 (не делится). Ответ «нет».
  • Случай 4: Два остатка одинаковы (1 или 2)‚ третий, 0. Пары: (1‚1)->2‚ (1‚0)->1‚ (1‚0)->Никакая не делится на 3. Ответ «нет».
  1. Все три цифры дают остаток 1 при делении на 3 (цифры 1‚ 4‚ 7).
  2. Все три цифры дают остаток 2 при делении на 3 (цифры 2‚ 5‚ 8).
  3. Или комбинация: две цифры с остатком 1 (или 2) и одна с остатком 0 (3‚ 6‚ 9‚ 0).

Но проще всего запомнить обратное: Вася загадает желание («да») во всех случаях‚ КРОМЕ когда остатки от деления на 3 образуют наборы {1‚ 1‚ 1}‚ {2‚ 2‚ 2}‚ {1‚ 1‚ 0}‚ {2‚ 2‚ 0}.

На практике для Яндекс Учебника (уровень «Начинающий») достаточно и прямого перебора пар. Это быстрее писать и меньше шанс ошибиться в логике.


💻 Примеры кода (Python 3)

Вариант 1: Прямой перебор (Рекомендуемый для обучения)

Самый понятный код‚ полностью соответствующий условию задачи.

# Считываем три числа через пробел
a‚ b‚ c = map(int‚ input.split)

sum1 = a + b
sum2 = b + c
sum3 = a + c

if sum1 % 3 == 0 or sum2 % 3 == 0 or sum3 % 3 == 0:
 print("да")
else:
 print("нет")

Вариант 2: Компактный (в одну строку логики)


a‚ b‚ c = map(int‚ input.split)
print("да" if (a+b)%3==0 or (b+c)%3==0 or (a+c)%3==0 else "нет")

Вариант 3: Через остатки (Оптимизированный)

Используем множества (set) для проверки уникальных остатков.


a‚ b‚ c = map(int‚ input.split)
r = {a % 3‚ b % 3‚ c % 3}


from collections import Counter
cnt = Counter([a%3‚ b%3‚ c%3])

if (1 in cnt and 2 in cnt) or cnt[0] >= 2:
 print("да")
else:
 print("нет")

Примечание: Для данной задачи Вариант 3 избыточен‚ но полезен для понимания теории чисел.


🐍 Решение на других языках (C++‚ Java)

C++ (GNU C++17)
#include <iostream>
using namespace std;

int main {
 int a‚ b‚ c;
 cin >> a >> b >> c;
 
 if ((a + b) % 3 == 0 || (b + c) % 3 == 0 || (a + c) % 3 == 0) {
 cout << "да" << endl;
 } else {
 cout << "нет" << endl;
 } return 0;
}
Java
import java.util.Scanner;

public class Main {
 public static void main(String[] args) {
 Scanner sc = new Scanner(System.in);
 int a = sc.nextInt;
 int b = sc.nextInt;
 int c = sc.nextInt;
 
 if ((a + b) % 3 == 0 || (b + c) % 3 == 0 || (a + c) % 3 == 0) {
 System.out.println("да");
 } else {
 System.out.println("нет");
 }
 }
}

❓ Частые ошибки учеников

  • Неправильный ввод: Пытаются считать число как одно целое (int n = int(input))‚ а потом выделять цифры через // 100‚ // 10 % 10‚ % 10. В условии сказано «Даны три числа»‚ обычно они разделены пробелом. Лучше использовать map(int‚ input.split).
  • Регистр вывода: Система проверки (автотесты) чувствительна к регистру. Нужно выводить строго да или нет (маленькими буквами‚ без точек и пробелов).
  • Логическая ошибка «И» вместо «ИЛИ»: Пишут if (a+b)%3==0 and (b+c)%3==0 .;.. Условие: «Если хотя бы одна сумма делится на три».
  • Проверка делимости самого числа: Проверяют (a100 + b10 + c) % 3 == 0. Это проверяет делимость всего трехзначного числа‚ а не попарных сумм цифр.

📞 Как связаться с поддержкой Яндекс Учебника

Если у вас возникли технические проблемы с платформой (не проходит тест‚ хотя код верный‚ ошибки интерфейса‚ вопросы по урокам)‚ вы можете обратиться в поддержку следующими способами:

  1. Чат поддержки внутри платформы: Обычно в правом нижнем углу экрана в Яндекс Учебнике есть значок «?» или «Помощь» / «Чат с поддержкой». Это самый быстрый способ.
  2. Email: education@yandex-team.ru (основной адрес для обратной связи по образовательным продуктам).
  3. Форма обратной связи на сайте: Перейдите на education.yandex.ru‚ пролистайте вниз до раздела «Контакты» или «Поддержка».
  4. Для учителей/родителей: Есть отдельная горячая линия: ###-###-#### (бесплатно по России).

Важно: При обращении обязательно укажите:

  • Логин/email аккаунта.
  • Название курса и номер урока/модуля.
  • Текст задачи (или ссылку на неё).
  • Скриншот ошибки или ваш код.
  • Ожидаемое и фактическое поведение.

Задача «Вася и приметы» — это отличная базовая задача на:

  • Ввод данных (input.split).
  • Арифметические операции (+‚ %).
  • Логические операторы (or).
  • Ветвление (if/else).

Главный совет: не усложняйте. Напишите три проверки сумм через or. Это читаемо‚ быстро работает и гарантированно пройдет все тесты Яндекс Учебника.

Удачи в обучении программированию! 🚀