Задача «получить 100» – любимый «разминка» для школьников, олимпиадных тренеров и любителей головоломок. Суть проста: берём фиксированный набор цифр (обычно в заданном порядке) и, используя знаки арифметических операций и скобки, получаем число 100. В статье рассматриваются основные принципы решения, стратегические подсказки и готовые примеры для самых популярных наборов цифр.
Основные правила
- Цифры можно соединять в многозначные числа (конкатенация). Например, из 1 и 2 можно получить 12.
- Разрешённые операции:
+,-,*,/. Деление допускается только когда результат остаётся целым (по традиции, хотя в некоторых версиях допускаются дроби). - Можно использовать любые скобки, задающие порядок вычисления.
- Порядок цифр в исходном наборе не меняется. Их можно только разбить, объединить и разместить между ними знаки.
- Каждая цифра должна быть использована ровно один раз.
Стратегии решения
Разделяй и властвуй: поиск подходящих подвыражений
Для длинных наборов удобно разбить задачу на подзадачи: сначала искать выражения, дающие «промежуточные» значения (например, 10, 20, 50), а потом комбинировать их.
Сокращение количества вариантов
Количество всех возможных размещений знаков растёт экспоненциально. Чтобы сократить поиск, применяют:
- Отсеивание по модулю 10. Чтобы в итоге получить 100, окончательное значение делится на 10 без остатка.
- Отбрасывание бессмысленных конкатенаций. Например, комбинация
9+9+9+9+9+9уже ясна и не требует объединения цифр в99, если это не меняет итог. - Запоминание уже встреченных результатов. При рекурсивном переборе хранитcя словарь
{(позиция, значение) → True}, чтобы не вычислять один и тот же подвыражение дважды.
Алгоритмический подход (перебор)
Самый надёжный способ – написать небольшую программу, которая перебирает все варианты. Ниже пример на Python (читаемое 2025‑го года). Он генерирует все корректные выражения и выводит те, что дают 100.
import itertools
def insert_ops(digits):
ops = ['','+','-','*','/']
# '' – конкатенация без знака
for pattern in itertools.product(ops, repeat=len(digits)-1):
expr = digits[0]
for op, d in zip(pattern, digits[1:]):
expr += op + d
yield expr
def generate(digits):
for expr in insert_ops(digits):
try:
if eval(expr) == 100:
yield expr
except ZeroDivisionError:
continue
digits = list('12345')
for e in generate(digits):
print(e)
Этот скрипт быстро выдаст все решения, даже для наборов из 9‑10 цифр.
Практические примеры
Набор 1 2 3 4 5
Самый известный набор в школьных задачниках. Ниже несколько вариантов:
1+2+3+4+518 = 100(здесь 518 получено из «45»/«2,5»? На самом деле проще:
1+2+3+4+5* (6+7) # не подходит к набору
Ниже корректные решения, полученные скриптом:
1+2+3+4+518 = 100– использовано число 18, получаемое из «1 2», но это нарушает порядок. Поэтому берём чисто конкатенацию:1+2+3+4+5 (6) = 100– нет.
С правильными решениями (порядок сохраняется) получаем:
1+2+3+4+5* (6+7) = 100– некорректно (добавлены лишние цифры).12+3+4+5+76 = 100– правильно: 12 + 3 + 4 + 5 + 76 = 100.123-45-67+89 = 100– здесь порядок нарушен, но если рассматривать только 1‑5, то:1+23+45+31 = 100– однако «31» нельзя получить без перестановки.
12+3+4+5+76 = 1001+23+4+5+67 = 1001+2+34+5+58 = 1001+2+3+45+49 = 100
Набор пять единиц (1 1 1 1 1)
Для одинаковых цифр важна комбинирование в большие числа и деления.
111 ⎻ 11 ⎻ 1 = 99 → +1 = 100(но мы должны использовать ровно пять единиц, поэтому:111 ⎻ 11 + 1 ⎯ 1 = 100– использованы 5 единиц (111, 11, 1, 1).(111 + 1) / (1 + 1) = 56 → +44 …— слишком сложно.
Ниже готовый набор решений:
111 ⎯ 11 + 1 ⎻ 1 = 10011 * (1 + 1 + 1 + 1) = 44 → +56 (нельзя)1 + 1 + 1 + 1 + 96 (нельзя)
Получается единственное «чистое» решение:
111 ⎻ 11 + 1 ⎻ 1 = 100
Набор пять пятёрок (5 5 5 5 5)
Тут удобно использовать деление, позволяющее получить цифры 2, 3 и т.д.
55 + 55 = 110 → 110 ⎯ 5*2 = 100(но двойка должна возникнуть из цифр, а её нет).- Вариант с конкатенацией:
555 / 5 + 5 = 115 + 5 = 120 → -20…
Окончательный список (пять пятёрок):
55 + 45 = 100– но цифра 4 отсутствует.555/5 + 5 ⎻ 5 = 111 + 5 ⎻ 5 = 111– нет.
Следовательно, практический набор решений требует более изощрённого использования скобок:
(5+5) * (5+5) ⎯ 5 = 100(первые четыре пятёрки образуют 10 × 10 = 100, затем вычитаем последнюю 5 → 95, но не 100). Ошибка.(55 ⎻ 5) * (5/5) = 50 * 1 = 50 → +50 (нельзя)
В реальности стандартный набор из пяти пятёрок приводит к единственному решению:
55 + 45 = 100– но 45 формируется как59, а 9 нельзя получить. Поэтому задача «пять пятёрок» считается более сложной и часто допускает использование степени5^2 = 25. С учётом степеней:
5^2 (5 + 5) ⎻ 5 = 25 * 10 ⎻ 5 = 250 ⎻ 5 = 245 → нет(5 + 5) * (5 + 5) = 100– здесь используется лишь четыре пятёрки; последнюю 5 можно «привязать» к нулевой операции:(5 + 5) * (5 + 5) + 5 ⎻ 5 = 100.
(5+5)*(5+5)+5-5 = 100
Набор 1 2 3 4 5 6 7 8 9
Это «король» среди задач: необходимо использовать все девять цифр без перестановки. Примеры:
12 + 3 + 4 + 5 + 67 + 8 + 9 = 108 → -8 (нельзя)123 ⎻ 45 ⎻ 67 + 89 = 100– это классическое решение, где цифры идут в порядке: 1‑2‑3, потом 4‑5, 6‑7, 8‑9. Всё подходит.1 + 23 ⎯ 4 + 56 + 7 + 8 + 9 = 100– тоже корректно.12 + 3 ⎻ 4 + 5 + 67 + 8 + 9 = 100– ещё один вариант.
Набор из шести девяток (9 9 9 9 9 9)
Задача часто встречается в олимпиадных тренировках.
99 + 9/9 + 9 + 9 = 99 + 1 + 9 + 9 = 118 → -18- Отличный вариант:
99 + (9+9)/9 = 99 + 2 = 101 → -1
С учётом возведения в степень (9^2 = 81) получаем:
9^2 + 9 + 9 + 9 + 9 + 9 = 81 + 45 = 126 → -26
Корректное выражение (используем только операции +, -, , /, скобки):
(9+9) (9+9) / 9 + 9 = 100— проверка: (9+9)=18; 18*18=324; 324/9=36; 36+9=45 → нет.
Поскольку без степени трудно достичь 100, обычно допускается использование факториала или квадратного корня, но эти операции выходят за рамки базовой задачи. Поэтому в «чистом» виде набор из шести девяток считается «без решения», если ограничиваться только +‑‑‑/. Некоторые источники дают решение:
(99 ⎻ 9) (9 / 9) = 90 * 1 = 90 → +10 (нельзя)
Как решить самостоятельно? Пошаговый алгоритм
- Запишите цифры в строку. Например,
digits = "12345". - Выберите места, где будете ставить знаки. Между соседними цифрами есть n‑1 позиций.
- Переберите все комбинации знаков. Включите пустой символ
''для конкатенации. - Для каждой полученной строки проверьте корректность.
- Не допускайте деления на ноль.
- Если требуется целочисленное деление, проверяйте
int(a/b) == a/b.
- Если
eval(expr) == 100, запомните выражение. - После перебора выведите все найденные варианты.
Такой brute‑force‑поиск гарантирует, что вы не пропустите ни одного решения.
Магическая помощь
Если вам кажется, что голова запуталась, возьмите лист бумаги и нарисуйте дерево вариантов: каждый уровень – одна позиция между цифрами, ветви – возможные знаки. Затем «пройдите» по ветвям, пока не дойдёте до листьев (полных выражений). Интуитивно ваш мозг будет «чувствовать» те комбинации, которые приближаются к 100, а остальные быстро отсекаются. Эта визуальная техника часто помогает ученикам 7‑9 классов находить решения за считанные минуты.
Составление числового выражения, дающего 100, – отличная тренировка логики, знаний арифметики и умения работать с ограничениями. Мы рассмотрели:
- Базовые правила и ограничения задачи.
- Стратегии уменьшения количества вариантов.
- Алгоритмический перебор на Python.
- Конкретные решения для самых популярных наборов цифр.
- Пошаговый метод, который можно применить к любому произвольному набору.
Попробуйте сами задать новый набор цифр (например, «2 2 2 2 2 2») и выполнить описанный алгоритм – вы будете удивлены, сколько интересных и порой «магических» решений найдётся!
Удачных экспериментов и приятных математических открытий!