Другие языки программирования и технологии

Факториалы больших чисел и действия с ними

Кто может помочь понять, что надо сделать чтобы решить 300!/(100!*100!*100!). Понимаю, что 100! из знаменателя сокращается на первые 100 множителей из 300!. Но остаются в числителе множители от 101 до 300, четные из них найдут свою пару из разложения знаменателя, но что-то должно же быть попроще. С программированием не знакома, оперирую только математическими знаниями.
Первый шаг на пути оптимизации — занести все числа в массив.
Сформируем 2 таких, в одном сохраним числа от 2 до 100, утроив их. В другом от 2 до 300.
Далее предлагаем программе вытаскивать числа из первого массива ради умножения, а далее проверять, делится ли уже существующее значение на первый элемент второго массива.

И прикрытия от возможных проблем:
Что, если в делимой части числа закончатся раньше? Ответ: тогда только проверяем на деление.
Что, если раньше кончатся числа в делителе? Тогда только умножаем.
Могу попробовать реализовать, если это практическое задание.
Игорь Лотков
Игорь Лотков
25 126
Лучший ответ
Игорь Лотков ___код для python, важна табуляция, которую сайт не сохранит.
Магома Магомедов Спасибо большое. Может и прав Евгений Высочин, что это не мое. Но проблема в том, что я способна на многое, кроме варки борща. Преподавала физическую химию, имею ученую степень, занимаюсь репетиторством. Ученик сдавал МАТЕМАТИКУ в ВШЭ. Все решил кроме этой задачи. И мне самой очень интересно стало как решить ее, зная лишь школьную программу по математике. Дело может в самом задании. В нем надо определить максимальное целое неотрицательное число р, при котором данное выражение с факториалами делится на 6^р. Если не пожалеть времени, можно решить самым примитивным образом. Но здесь должно быть что-то математическое. Спасибо за участие в моей проблеме. Мне действительно не место в сообществе программистов. Suum cuique.
Проще всего напрямую вычислить. На PascalABC.NET:
var p,q:biginteger;
begin
p:=1; q:=1;
for var i:=1 to 300 do p*=i;
for var i:=1 to 100 do q*=i;
writeln(p/(q*q*q))
end.
Результат
376523493564631064367712071965768747782444205128669798396168767743500485766630075466163294008566118208045715304490994009624725072511252178400
Или на калькуляторе из Интернета для работы с большими числами
3.765234935646310643677120719657687477824442051286697983961687677435004857666300754661632940085661182080457153044909940096247250725112521784e+140
300!/(100!*100!*100!) = (101 * 102 * ...200) * (201 * 202 * ...300) / (100! * 100!)
________

(101 * 102 * ...* 199 * 200) / (1 * 2 * 3 * ...* 99 * 100)

= (101 / 1) * (102 / 2) * (103 / 3) * ...* (200 / 100)

= (200 / 100) * (198 / 99) * (196 / 98) * (194 / 97) * (102 / 51) * остальное

= 2 * 50 * остальное

= 100 * (199 * 197 * 195 * .. * 101) / (1 * 2 * ...* 49 * 50)

(то же самое для 201-300)

Вроде дальше некуда сокращать...
Можно еще пятерки сократить для (195 / 50) * (185 * 45), но легче уж циклом досчитать. Количество операций примерно вдвое сократилось.
Не твоё это. Иди вари борщ! :)
Дуся Макаревич
Дуся Макаревич
37 945
А что надо-то - просто значение получить? Тогда можно зайти в командную оболочку Питона и набрать:
from math import factorial as f
print(f(300)/f(100)**3)
И тут же появится ответ:
3.7652349356463108е+140
Сергей Гура
Сергей Гура
28 648