В задаче из Яндекс‑учебника описывается интересная привычка вымышленного персонажа Васи․ Он смотрит на трёхзначный номер (например, номер машины или квартиры), разбивает его на цифры a, b, c и считает три попарные суммы:
- S₁ = a + b
- S₂ = b + c
- S₃ = a + c
Если хотя бы одна из этих сумм делится на 3 без остатка, Вася загадывает желание․ Нам даны три целых числа (цифры) a, b, c (0 ≤ a,b,c ≤ 9)․ Нужно вывести «да», если условие выполняется, и «нет» в противном случае․
Почему достаточно проверять только попарные суммы?
Делимость на 3 имеет хорошо известное свойство: число делится на 3 тогда и только тогда, когда сумма его цифр делится на 3․ В нашем случае мы не проверяем само трёхзначное число, а рассматриваем суммы пар цифр․ Если любая из этих сумм кратна 3, то условие задачи выполнено․
Алгоритм решения
- Считаем три числа a, b, c․
- Вычисляем три суммы:
a+b,b+c,a+c․ - Проверяем, делится ли хотя бы одна из них на 3 (остаток от деления равен 0)․
- Если да – выводим «да», иначе – «нет»․
Время работы алгоритма – O(1), так как выполняется фиксированное количество арифметических операций․ Память также постоянна․
Примеры
| Ввод (a b c) | Суммы | Делится на 3? | Ответ |
|---|---|---|---|
| 2 2 2 | 4, 4, 4 | Нет | нет |
| 1 2 3 | 3, 5, 4 | Да (3) | да |
| 0 0 0 | 0, 0, 0 | Да (0) | да |
| 5 7 9 | 12, 16, 14 | Да (12) | да |
| 4 1 1 | 5, 2, 5 | Нет | нет |
Личный приём: как быстро решить в уме
Если вы решаете задачу без бумаги, полезно запомнить следующее наблюдение:
- Сумма двух цифр делится на 3, если остатки этих цифр при делении на 3 в сумме дают 0 или 3․
- Остатки цифр от деления на 3 могут быть только 0, 1 или 2․
- Поэтому достаточно посмотреть на остатки
a%3,b%3,c%3и проверить, есть ли среди пар (a%3 + b%3), (b%3 + c%3), (a%3 + c%3) сумма, равная 0 или 3․
Это избавляет от лишних сложений и позволяет решить задачу за пару секунд․
Реализация на популярных языках (псевдокод)
Ниже представлен простой псевдокод, который легко перевести на любой язык программирования․
function vasyaWish(a, b, c): if ( (a+b) % 3 == 0 ) or ( (b+c) % 3 == 0 ) or ( (a+c) % 3 == 0 ): return "да" else: return "нет"
На Python:
def vasya_wish(a, b, c): if (a+b) % 3 == 0 or (b+c) % 3 == 0 or (a+c) % 3 == 0: return "да" return "нет" print(vasya_wish(2,2,2)) # нет print(vasya_wish(1,2,3)) # да
На C++:
#include <iostream>
using namespace std;
string vasyaWish(int a, int b, int c) {
if ((a+b)%3==0 || (b+c)%3==0 || (a+c)%3==0)
return "да";
return "нет";
}
int main {
int a,b,c; cin >> a >> b >> c;
cout << vasyaWish(a,b,c) << endl;
return 0;
}
Задача про Васю – отличный пример того, как простое свойство делимости на 3 позволяет быстро решить, понадобится ли загадывать желание․ Достаточно вычислить три попарные суммы и проверить их на кратность трём․ Алгоритм работает за постоянное время и не требует сложных структур данных․
Теперь вы можете смело отвечать на подобные вопросы в тестах, собеседованиях или просто впечатлять друзей своей быстрой сообразительностью!