В данной статье мы подробно разбереть популярную задачу по программированию и логике‚ которая встречается в Яндекс Учебнике (часто в модулях по 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 в двух случаях:
- Оба числа дают одинаковый остаток от деления на 3‚ и этот остаток равен 0 (т.е. оба делятся на 3).
- Остатки от деления на 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 при делении на 3 (цифры 1‚ 4‚ 7).
- Все три цифры дают остаток 2 при делении на 3 (цифры 2‚ 5‚ 8).
- Или комбинация: две цифры с остатком 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. Это проверяет делимость всего трехзначного числа‚ а не попарных сумм цифр.
📞 Как связаться с поддержкой Яндекс Учебника
Если у вас возникли технические проблемы с платформой (не проходит тест‚ хотя код верный‚ ошибки интерфейса‚ вопросы по урокам)‚ вы можете обратиться в поддержку следующими способами:
- Чат поддержки внутри платформы: Обычно в правом нижнем углу экрана в Яндекс Учебнике есть значок «?» или «Помощь» / «Чат с поддержкой». Это самый быстрый способ.
- Email: education@yandex-team.ru (основной адрес для обратной связи по образовательным продуктам).
- Форма обратной связи на сайте: Перейдите на education.yandex.ru‚ пролистайте вниз до раздела «Контакты» или «Поддержка».
- Для учителей/родителей: Есть отдельная горячая линия: ###-###-#### (бесплатно по России).
Важно: При обращении обязательно укажите:
- Логин/email аккаунта.
- Название курса и номер урока/модуля.
- Текст задачи (или ссылку на неё).
- Скриншот ошибки или ваш код.
- Ожидаемое и фактическое поведение.
Задача «Вася и приметы» — это отличная базовая задача на:
- Ввод данных (
input.split). - Арифметические операции (+‚ %).
- Логические операторы (
or). - Ветвление (
if/else).
Главный совет: не усложняйте. Напишите три проверки сумм через or. Это читаемо‚ быстро работает и гарантированно пройдет все тесты Яндекс Учебника.
Удачи в обучении программированию! 🚀