Найти тему
ZDG

Проект Эйлер 53: Комбинаторные выборки

Оглавление

Задача

Решение

Гуру-питонисты просто вызовут функцию ncr(), которая сама всё посчитает.

Нам же придётся реализовать формулу:

n! / r! / (n - r)!

И основная проблема тут, конечно же, в чудовищном размере получаемых факториалов. В какой-то из предыдущих задач такое уже было. Фишка в том, что не надо считать факториал как есть. Так как здесь один факториал делится на другой, то можно сразу делить сами члены ряда факториала друг на друга, не дожидаясь, пока они превратятся в громадное число. Я не стал смотреть в старую задачу и просто написал решение, подходящее для этой.

Итак, в числителе находится n!, а в знаменателе r! и (n - r)!. Я сделал функцию, которая принимает на вход три значения факториалов, т.е. n, r и n - r, и тупо начинает считать факториал n!. Меня интересуют факториалы n начиная с миллиона, иначе всё остальное можно и не считать. Как только n! достигает миллиона, я начинаю делить его на члены факториала r!. Если этого оказывается недостаточно, то дальше я делю его на члены факториала (n - r)!.

-2

Чтобы не париться с подбором целочисленных делителей, факториал я просто сделал типа double. Его точное значение не интересует, только достиг он миллиона или нет.

Ну и собственно программа:

-3

Перебираем все возможные n и r до 100. По условиям задачи первое подходящее n начинается с 23.

Ну и всё.

Ссылка на онлайн-компилятор языка C c текстом программы

Подборка всех задач:

Проект Эйлер | ZDG | Дзен