Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с подсчетом C(n,k)(С из n по k) в больших числах  (Прочитано 18836 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ZOObilo
Гость
« : 21-03-2004 19:06 » 

Имеется задача: посчитать C(n,k) в больших числах, но так, чтобы сначала производились необходимые деления, а уж потом умножения. Передумал кучу вариантов, но проблема везде одна: надо выделять массив либо из k, либо из n-k элементов (в лучшем случае битов, что тоже много), что, сами понимаете, невозможно, т.к. n и k практически не ограничены. Отсюда вопрос: как вы думаете, можно проделать необходимые операции, не прибегая к выделению массивов?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 21-03-2004 19:35 » 

Что есть С - колличество сочетаний? Сумма, среднее арифметическое?? Телепаты в отпуске....

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

Для любой из этьих задач.
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 21-03-2004 19:52 » 

http://www.flasher.ru/forum/showthread.php?s=29b9a41443488d567f5058cd552d22b6&threadid=30824
Цитата
Есть такая наука, как комбинаторика. Есть такая функция как "Цэ из эн по ка" (не по-китайски). Выглядит так: C(n,k). Означает следующее:
X=C(N,K) == X равно количеству способов выбрать K предметов из N.

Выглядит формула так: C(n,k)=n!/(k!*(n-k)!), где n! - факториал числа n.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
ZOObilo
Гость
« Ответ #3 : 21-03-2004 22:51 » 

Гром, здесь суть не в том, что не хочется использовать массив, а в том, что не хватит памяти выделить даже по одному биту, если этих битов понадобися 'большое число' (например 10^100 бит Вам уже не выделить). Причем не важно, хранить эти биты списком, или массивом, или еще как-нибудь.

RXL, насколько я понял, там речь о треугольнике Паскаля. В принципе, можно ограничиться двумя строками, но даже они не влезут в память при БОЛЬШИХ ЧИСЛАХ.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 22-03-2004 07:10 » 

ZOObilo, что за задача такая?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
ZOObilo
Гость
« Ответ #5 : 22-03-2004 08:31 » 

RXL, задача сформулирована в первом посте. Если имеется в виду какая-то более глобальная, то таковой нет. Задача из университета...
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #6 : 22-03-2004 10:44 » 

Tak ya i utochnyal kombinatorika li eto...  Ага
ZOObilo, ty ne slyshish.

Lyuboi process - vydaet reshenie - t.e. cifru. V dannom sluchae reshenie - chislo vozmozhnyh sochetaniy

Est takaya vozmozhnost' razbit ves' process vychisleniy na dostupnye etapy....

1. Zapisat formulu vichisleniya lubogo somnozhitelya (elementa massiva) v zavisimosti ot indeksa. Togda tebe ne nuzhna pamyat voobshe - vsya formula budet umeshatsya v summu ili umnozhenie...
2. Vtoroy etap - poluchit chastnye rezultaty i sohranyat ih v svyaznom spiske rezultatov, chto dast tebe vozmozhnost imet massv realnoi dliny.
3. Vychislyat rezultaty dostatochno malenkimi, a potom - poluchit obshiy rezultat finalnoi formuloi - kotoryi zapisat ne v odin tip dannyh a v svoi sobstvenny.
Записан

А птичку нашу прошу не обижать!!!
ZOObilo
Гость
« Ответ #7 : 22-03-2004 12:57 » 

Гром, действительно проблемы. Сорри.

Решение найдено!
C(n,k)=C(n-1,k)*n/(n-k)=...=П(i=k+1..n,i/(i+k)), 0<k<n-1

Я даже готов доказать, что это будет корректно работать.

Все. Спасибо всем.
Записан
stragner
Гость
« Ответ #8 : 22-03-2004 13:09 » 

Цитата

c(n,k) = n! / (k! * (n-k)!)

А что, если не делить в лоб, а ,например, использовать сокращения чисел
Для начала надо сократить  на k!, то есть в числителе останется  не N!, а произведение чисел (k+1)*(k+2)*...*n. У нас в знаменателе есть
(n-k)! = 1*2*3*4*...*m*...*(n-k)! .  Берем число m и сокращаем его с каким-нибудь числом из числителя и т.д. В итоге останется ряд чисел, произведение которого будет давать не такое уж и большое число Улыбаюсь
Записан
ZOObilo
Гость
« Ответ #9 : 22-03-2004 20:16 » 

stragner, постомри внимательней на фрмулу. Там это учитывается. А тот вариант, который предлагаешь ты, как раз и приводит к хранению огромного массива. Но в любом случае спасибо за отзыв...  Отлично
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #10 : 22-03-2004 20:39 » 

ZOObilo, рад если натолкнул на правильную мысль, буду рад видеть тебя у нас всегда - присоединяйся.  Ага
Записан

А птичку нашу прошу не обижать!!!
ZOObilo
Гость
« Ответ #11 : 23-03-2004 12:51 » 

Thanx.  Улыбаюсь  Отлично
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines