Вася любит математику и одновременно верит в свои собственные приметы.
Когда он видит трёхзначный номер (например‚ номер машины или квартиры)‚ он разбивает его на три цифры a‚ b‚ c и считает попарные суммы:
- S₁ = a + b
- S₂ = b + c
- S₃ = a + c
Если хотя бы одна из этих сумм делится на 3 без остатка‚ Вася загадывает желание.
По трём заданным числам нужно определить‚ загадает ли он желание‚ и вывести ответ «да» или «нет».
Формулировка задачи
Ввод: три целых числа a b c (каждое от 0 до 9‚ но алгоритм работает и для любого целого).
Алгоритм решения
- Считать три числа
a‚b‚c; - Вычислить три попарные суммы:
- s1 = a + b
- s2 = b + c
- s3 = a + c
- Проверить условие:
(s1 % 3 == 0) || (s2 % 3 == 0) || (s3 % 3 == 0)
Если условие истинно – вывести «да»‚ иначе – «нет».
Доказательство корректности
Задача требует проверить существование хотя бы одной пары цифр‚ чья сумма делится на 3.
Алгоритм формирует все возможные пары из трёх элементов (их ровно три: (a‚b)‚ (b‚c)‚ (a‚c)) и вычисляет их суммы.
Если хотя бы одна из этих сумм делится на 3‚ условие задачи выполнено‚ и алгоритм выводит «да».
Если ни одна сумма не делится на 3‚ то требуемой пары не существует‚ и правильный ответ – «нет».
Следовательно‚ алгоритм возвращает правильный результат для любого набора входных данных.
Сложность алгоритма
Все операции выполняются за постоянное время:
- Время – O(1) (fixed number of arithmetic operations).
- Память – O(1) (только несколько целочисленных переменных).
Примеры
| 2 2 2 | 4‚ 4‚ 4 | нет | нет |
| 1 2 3 | 3‚ 5‚ 4 | да (3) | да |
| 0 5 7 | 5‚ 12‚ 7 | да (12) | да |
| 4 4 1 | 8‚ 5‚ 5 | нет | нет |
Реализация на популярных языках программирования
Python 3
def vasya_wish(a: int‚ b: int‚ c: int) -> str:
return 'да' if ((a + b) % 3 == 0 or
(b + c) % 3 == 0 or
(a + c) % 3 == 0) else 'нет'
if __name__ == '__main__':
a‚ b‚ c = map(int‚ input.split)
print(vasya_wish(a‚ b‚ c))
C++ (GNU++17)
#include <bits/stdc++.h>
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 << "да
";
else
cout << "нет
"; return 0;
}
Java 17
import java.util.*;
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("нет");
}
}
Особенности и возможные подводные камни
- Ведущие нули. При чтении как целые числа они исчезают‚ но это не влияет на суммы‚ потому что 0 не меняет результат.
- Числа вне диапазона 0‑9. Условие задачи сформулировано для любых целых‚ поэтому алгоритм остаётся верным.
- Отрицательные числа. В большинства языков оператор % может давать отрицательный остаток. Чтобы избежать недоразумений‚ можно использовать
Math.abs(x) % 3 == 0или привести остаток к неотрицательному виду:((x % 3) + 3) % 3 == 0. В данной задаче‚ однако‚ отрицательные входы не ожидаются. - Большие входные данные. Поскольку алгоритм работает за O(1)‚ ограничения по времени и памяти практически не имеют значения.
Задача «Вася и приметы» является отличным упражнением для закрепления базовых навыков:
- чтение входных данных;
- выполнение простых арифметических операций;
- использование условных операторов;
- формирование корректного вывода.
Несмотря на кажущуюся простоту‚ она напоминает о важности полного перебора всех возможных вариантов (в данном случае – всех пар) и точной проверки условия задачи.