Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Проблема с подсчетом C(n,k)(С из n по k) в больших числах

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
ZOObilo



Зарегистрирован: 21.03.2004
Сообщения: 3
Откуда: SPb

СообщениеДобавлено: Вс Мар 21 2004 22:12    Заголовок сообщения: Проблема с подсчетом C(n,k)(С из n по k) в больших числах Ответить с цитатой

Имеется задача: посчитать C(n,k) в больших числах, но так, чтобы сначала производились необходимые деления, а уж потом умножения. Передумал кучу вариантов, но проблема везде одна: надо выделять массив либо из k, либо из n-k элементов (в лучшем случае битов, что тоже много), что, сами понимаете, невозможно, т.к. n и k практически не ограничены. Отсюда вопрос: как вы думаете, можно проделать необходимые операции, не прибегая к выделению массивов?
_________________
Бойтесь тормозного зверя IE. Слушайте Opera. ^_^
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
grayrat



Зарегистрирован: 30.06.2003
Сообщения: 189

СообщениеДобавлено: Пн Мар 22 2004 10:02    Заголовок сообщения: Ответить с цитатой

На сколько большие числа ?

Можно считать используя рекуррентную формулу, массивы не нужны.

Можно вообще обойтись без умножений и делений используя треугольник Паскаля, но будет нужен массив длины n.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ZOObilo



Зарегистрирован: 21.03.2004
Сообщения: 3
Откуда: SPb

СообщениеДобавлено: Пн Мар 22 2004 11:46    Заголовок сообщения: Ответить с цитатой

Ну, я тут подумал, что порядок n-k не так уж и велик. Где-то порядка 10^4. Результаты в этом случае конечно здоровые, но... выделить массив из 10000 элеметнов по 100 байт не так уж сложно. Наверное, так и сделаю, хотя очень интересно, есть ли решение поставленной задачи (понятно, что в случае, когда невозможно выделить память под массив, невозможен будет и вариант с рекурсией - каждый раз на стек будет класться большое число и в итоге получим тот же массив, но не выделенный явно, да еще и больше, потому что, например, туда еще и код возврата кладется).
_________________
Бойтесь тормозного зверя IE. Слушайте Opera. ^_^
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DmitryShm1
Гость





СообщениеДобавлено: Пн Мар 22 2004 11:59    Заголовок сообщения: Надо писать программы хорошо Ответить с цитатой

C(n,k) = n*(n-1)*..*(n-k+1)/k! . C(n,k) = C(n,k-1) + C(n-1, k-1);
числитель и знаменатель вычисляйте отдельно, а потом делите. Есть хорошая практика хранить вместо чисел степени их простых делителей, как спектр. И тогда проблема с умножением и делением отпадает. Тогда и производительность возрастет. Рекоммнедую все реализовать на ассемблере. Простые числа следует вычислить сразу на один проход и хранить их где-то, а потом уже запускать алгоритм. Идея с рекурсией отпадает сразу из-за граничных условий.
Вернуться к началу
grayrat



Зарегистрирован: 30.06.2003
Сообщения: 189

СообщениеДобавлено: Пн Мар 22 2004 12:41    Заголовок сообщения: я не ту рекурсию имел в виду Ответить с цитатой

имелась в виду рекуррентная формула, которую не только необязательно, но и не нужно считать с пом. рекурсии. Считается с помощью обычного цикла.

C(n,k)=C(n-1,k)*n/(n-k)=...=П(i=k+1..n,i/(i+k)), 0<k<n-1
, а для k=n, понятно, C(n,n)=1.

Что касается треугольника Паскаля, то он прост как веник!
Код:

             1  1
            1  2  1
           1 3   3  1
          1 4  6  4  1
        1  5 10 10  5  1

Выглядит несколько коряво, но идея понятна ?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ZOObilo



Зарегистрирован: 21.03.2004
Сообщения: 3
Откуда: SPb

СообщениеДобавлено: Пн Мар 22 2004 15:59    Заголовок сообщения: Ответить с цитатой

Четко. Рекурсивная формула сработает. Я даже готов это доказать.

Всем спасибо.
_________________
Бойтесь тормозного зверя IE. Слушайте Opera. ^_^
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...