Вася и приметы

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

  • S₁ = a + b
  • S₂ = b + c
  • S₃ = a + c

Если хотя бы одна из этих сумм делится на 3 без остатка‚ Вася загадывает желание.
По трём заданным числам нужно определить‚ загадает ли он желание‚ и вывести ответ «да» или «нет».

Формулировка задачи

Ввод: три целых числа a b c (каждое от 0 до 9‚ но алгоритм работает и для любого целого).

Алгоритм решения

  1. Считать три числа a‚ b‚ c;
  2. Вычислить три попарные суммы:
    • s1 = a + b
    • s2 = b + c
    • s3 = a + c
  3. Проверить условие:
     (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)‚ ограничения по времени и памяти практически не имеют значения.

Задача «Вася и приметы» является отличным упражнением для закрепления базовых навыков:

  • чтение входных данных;
  • выполнение простых арифметических операций;
  • использование условных операторов;
  • формирование корректного вывода.

Несмотря на кажущуюся простоту‚ она напоминает о важности полного перебора всех возможных вариантов (в данном случае – всех пар) и точной проверки условия задачи.