Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2013, 16:48   #11
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,356
По умолчанию

Первое - количество всех комбинаций N!/(M! * (N - M)!) (число сочетаний из N по M).
В Вашем случае 52!/(13! * 39!) = 635013559600 комбинаций (влезает только в int64, если рассматривать целые типы).

UPD
Зафиксируем группу из L (четырех) шаров. Эта группа может располагаться на N возможных местах. При этом, для расстановки оставшихся M-L шаров осталось N-L-2 ячеек. То есть, количество комбинаций равно N*(число сочетаний из N-L-2 по M-L, исключая рядом находящиеся L). Осталось придумать, как исключить из количества сочетаний рядом находящиеся L.

UPD2
Вырисовывается рекуррентная задача:
Нужно посчитать количество всех комбинаций и вычесть из них количество комбинаций, где есть подряд идущие L шаров.

В рассуждениях выше возможны ошибки
Дописываю при появлении мыслей
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 11.05.2013 в 17:52.
BDA на форуме Ответить с цитированием
Старый 11.05.2013, 16:52   #12
DarkDen
Пользователь
 
Регистрация: 11.05.2013
Сообщений: 38
По умолчанию

Почему отладчик выдает ошибки при типе int64 ? Спасибо

Нужно будет изменять алгоритм цикла в программе? Спасибо

Методом рекурентных отношений я схожие задачи решал, эту не получаеться.

Последний раз редактировалось Stilet; 11.05.2013 в 17:49.
DarkDen вне форума Ответить с цитированием
Старый 11.05.2013, 17:44   #13
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,356
По умолчанию

По ходу раздумий возник вопрос:
Если в ячейках подряд расположены более чем 4 красных шара, то это считается событием? И если это рассматривать как событие, то сколько раз его считать?
Например:
1110 - нужно событие 2 единички подряд, считать как 2 события или как одно, и считать ли событием вообще
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 11.05.2013, 17:53   #14
DarkDen
Пользователь
 
Регистрация: 11.05.2013
Сообщений: 38
По умолчанию

Может быть проблема в том что не получается задать нужный тип вместо integer, так как когда я задавал м=12 то есть количество искомых комбинаций было меньше, ошибки не было. Или попробовать Турбо Паскаль? Спасибо
DarkDen вне форума Ответить с цитированием
Старый 11.05.2013, 17:56   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Почему отладчик выдает ошибки при типе int64 ?
Потому что ты мои посты не читаешь )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.05.2013, 18:14   #16
DarkDen
Пользователь
 
Регистрация: 11.05.2013
Сообщений: 38
По умолчанию

Если в ячейках подряд расположены более чем 4 красных шара, то это считается событием? И если это рассматривать как событие, то сколько раз его считать?

Именно по этой причине я не мог составить математическую формулу, не знал какое колличество комбинаций необходимо исключить.
Если даже 2 или 3 раза за один расклад всех шаров, появляется комбинация из 4 красных шаров это считаеться одним событием, математическая формула которую я составил считала это разными событиями и в этом была ошибка.
Если не 4 а 5 красных шарв выполо подряд это считаеться не 2 а 1 событием.
Я думаю програмным методом эту задачу решить немного легче чем искать математическую формулу, но нужен безошибочный алгоритм.
Спасибо

Потому что ты мои посты не читаешь )

Читаю, но мне не всегда хватает подготовки и знаний что бы понять. Спосибо

Последний раз редактировалось Stilet; 11.05.2013 в 18:53.
DarkDen вне форума Ответить с цитированием
Старый 11.05.2013, 18:52   #17
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,338
По умолчанию

Если посмотреть на эту часть кода,
Код:
 i:=m;
while a[i]=n-m+i do dec(i);
то поскольку значения переменных n и m
в теле цикла
Код:
repeat
s := '';
...
until i = 0;
не изменяются, то получается такая картина:
a[i] <> n-m+i и оператор dec(i) не выполняется.
Обратите внимание, что -m+i - дает, в этом коде, всегда ноль.
На следующей итерации значение i восстанавливается.
Выполняется операция inc(a[i]);
Это и приводит к переполнению элемента a[i].

Тут проблема в алгоритме.


Как-то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 11.05.2013, 19:00   #18
DarkDen
Пользователь
 
Регистрация: 11.05.2013
Сообщений: 38
По умолчанию

Тогда почему когда я задаю М меньше 12 ошибки нет?
Спасибо
DarkDen вне форума Ответить с цитированием
Старый 11.05.2013, 22:43   #19
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,338
По умолчанию

А какое значение у n?
Сделайте так:
1. Наведите курсор на интересующую Вас переменную и нажмите Ctrl+F7
Тогда можно пронаблюдать эволюцию переменных.
2. Для того, что бы окно Watches было видно в процессе отладки:
Window - Cascade.
3. Жмите F8 и отслеживайте по шагам.

Кстати, у меня n = 4, а m = 7.
А какие значения допустимы?

Цитата:
Тогда почему когда я задаю М меньше 12 ошибки нет?
Попробуйте разобраться с той частью кода, на которую я обратил внимание.


Как-то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.05.2013, 09:17   #20
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
N=52 M=13.
Я правильно понимаю что N - кол-во шаров(и ячеек) в целом, а M - кол-во красных шаров?

Ввел Int64, компилируется..
Код:
program sochets_m;
var
   i, n, m, l: Int64;
   k1,k2: LongInt;
   j : LongInt;
   a: array[0 .. 100] of integer;
   s, t: string;
   d: set of byte;
 
begin
   write('Enter N and M: ');
   read(n, m);
   if n<10 then l:=2 else if n<100 then l:=3 else l:=4;
      {form. per. soch.}
   for j:=0 to m do a[j]:=j;
   k1:=0;
   k2:=0;
   repeat
         s:='';
         d:=[];
         for j:=1 to m do begin
            d:=d+[a[j]];
            str(a[j]:l,t);
            s:=s+t
         end;
         if
            (1 in d) and (2 in d) and (3 in d) and (4 in d) or {1}
            (2 in d) and (3 in d) and (4 in d) and (5 in d) or {2}
            (3 in d) and (4 in d) and (5 in d) and (6 in d) or {3}
            (4 in d) and (5 in d) and (6 in d) and (7 in d) or {4}
            (5 in d) and (6 in d) and (7 in d) and (8 in d) or {5}
            (6 in d) and (7 in d) and (8 in d) and (9 in d) or {6}
            (7 in d) and (8 in d) and (9 in d) and (10 in d) or {7}
            (8 in d) and (9 in d) and (10 in d) and (11 in d) or {8}
            (9 in d) and (10 in d) and (11 in d) and (12 in d) or {9}
            (10 in d) and (11 in d) and (12 in d) and (13 in d) or {10}
            (11 in d) and (12 in d) and (13 in d) and (14 in d) or {11}
            (12 in d) and (13 in d) and (14 in d) and (15 in d) or {12}
            (13 in d) and (14 in d) and (15 in d) and (16 in d) or {13}
            (14 in d) and (15 in d) and (16 in d) and (17 in d) or {14}
            (15 in d) and (16 in d) and (17 in d) and (18 in d) or {15}
            (16 in d) and (17 in d) and (18 in d) and (19 in d) or {16}
            (17 in d) and (18 in d) and (19 in d) and (20 in d) or {17}
            (18 in d) and (19 in d) and (20 in d) and (21 in d) or {18}
            (19 in d) and (20 in d) and (21 in d) and (22 in d) or {19}
            (20 in d) and (21 in d) and (22 in d) and (23 in d) or {20}
            (21 in d) and (22 in d) and (23 in d) and (24 in d) or {21}
            (22 in d) and (23 in d) and (24 in d) and (25 in d) or {22}
            (23 in d) and (24 in d) and (25 in d) and (26 in d) or {23}
            (24 in d) and (25 in d) and (26 in d) and (27 in d) or {24}
            (25 in d) and (26 in d) and (27 in d) and (28 in d) or {25}
            (26 in d) and (27 in d) and (28 in d) and (29 in d) or {26}
            (27 in d) and (28 in d) and (29 in d) and (30 in d) or {27}
            (28 in d) and (29 in d) and (30 in d) and (31 in d) or {28}
            (29 in d) and (30 in d) and (31 in d) and (32 in d) or {29}
            (30 in d) and (31 in d) and (32 in d) and (33 in d) or {30}
            (31 in d) and (32 in d) and (33 in d) and (34 in d) or {31}
            (32 in d) and (33 in d) and (34 in d) and (35 in d) or {32}
            (33 in d) and (34 in d) and (35 in d) and (36 in d) or {33}
            (34 in d) and (35 in d) and (36 in d) and (37 in d) or {34}
            (35 in d) and (36 in d) and (37 in d) and (38 in d) or {35}
            (36 in d) and (37 in d) and (38 in d) and (39 in d) or {36}
            (37 in d) and (38 in d) and (39 in d) and (40 in d) or {37}
            (38 in d) and (39 in d) and (40 in d) and (41 in d) or {38}
            (39 in d) and (40 in d) and (41 in d) and (42 in d) or {39}
            (40 in d) and (41 in d) and (42 in d) and (43 in d) or {40}
            (41 in d) and (42 in d) and (43 in d) and (44 in d) or {41}
            (42 in d) and (43 in d) and (44 in d) and (45 in d) or {42}
            (43 in d) and (44 in d) and (45 in d) and (46 in d) or {43}
            (44 in d) and (45 in d) and (46 in d) and (47 in d) or {44}
            (45 in d) and (46 in d) and (47 in d) and (48 in d) or {45}
            (46 in d) and (47 in d) and (48 in d) and (49 in d) or {46}
            (47 in d) and (48 in d) and (49 in d) and (50 in d) or {47}
            (48 in d) and (49 in d) and (50 in d) and (51 in d) or {48}
            (49 in d) and (50 in d) and (51 in d) and (52 in d) or {49}
            (50 in d) and (51 in d) and (52 in d) and (1 in d) or {50}
            (51 in d) and (52 in d) and (1 in d) and (2 in d) or {51}
            (52 in d) and (1 in d) and (2 in d) and (3 in d) {52}
         then begin
            Inc(k2);
            Writeln(k2:10,'     ',s)
         end;
         i:=m;
         while a[i]=n-m+i do dec(i);
         inc(a[i]);
         for j:=i+1 to m do a[j]:=a[j-1]+1;
         Inc(k1);
    until i=0;
    Writeln('Total combinations: ',k1);
    Writeln('X combinations: ',k2);
    end.

Последний раз редактировалось Poma][a; 12.05.2013 в 09:25.
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исправить ошибку арифметического переполнения в алгоритме. DarkDen Паскаль, Turbo Pascal, PascalABC.NET 2 11.05.2013 13:16
как исправить ошибку? phasha Помощь студентам 0 11.01.2012 21:32
как исправить ошибку? aiktz Паскаль, Turbo Pascal, PascalABC.NET 3 24.09.2009 18:56
прога на Паскале помогите исправить ошибку:( Jeksik Помощь студентам 4 14.10.2008 18:21