Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Помогите с задачей


Автор: otshelnik9 28.5.2010, 21:08
ВОт задача: из группы студентов n нужно получить шруппу студентов m для уборки, сколькими способами это можно сделать (n>m).

Автор: ФедосеевПавел 29.5.2010, 07:53
Учебник математики - комбинаторика - сочетания. http://ru.wikipedia.org/wiki/Сочетания

Автор: otshelnik9 29.5.2010, 08:52
Ага спасибо, я уже нашол

Вот что-то наклепал, но какая-то ошибка в коде и не уверен что скобочки правильно раставил...
Код


program lab1;
uses crt;
var  n,m,f,g,otv:integer;
function fact(n:integer):longint;
begin
  if n=0 then fact:=1
         else fact:=n*fact(n-1);
end;
function factm(m:integer):longint;
begin
  if m=0 then factm:=1
  else factm:=m*factm(m-1);
end;
begin
clrscr;
writeln('vvedite kol-vo studentov v grupe');
readln(n);
writeln('kol-vo studentov dlya uborki');
readln(m);
otv:=fact(n)/(factm(m)*(fact(n)-factm(m))))
readln(otv);
write(otv);
end;
end.




M
THandle
Модератор: используйте подсветку кода!

Автор: ~FoX~ 29.5.2010, 09:08
Otv не может быть integer

Код

fact(n)/(Factm(m)*(Fact(n)-Factm(m)))


Цитата(otshelnik9 @  29.5.2010,  09:52 Найти цитируемый пост)
readln(otv);

Вообще лишнее

Автор: otshelnik9 29.5.2010, 10:09
Всё равно ошибка type mismatch

Автор: ~FoX~ 29.5.2010, 11:05
Цитата(otshelnik9 @  29.5.2010,  11:09 Найти цитируемый пост)
Всё равно ошибка type mismatch 

Еще раз
Цитата(~FoX~ @  29.5.2010,  10:08 Найти цитируемый пост)
Otv не может быть integer


Код

program lab1;
uses crt;
var  n,m,f,g:integer;
    otv: real;
function fact(n:integer):longint;
begin
  if n=0 then fact:=1
         else fact:=n*fact(n-1);
end;
function factm(m:integer):longint;
begin
  if m=0 then factm:=1
  else factm:=m*factm(m-1);
end;
begin
  clrscr;
  writeln('vvedite kol-vo studentov v grupe');
  readln(n);
  writeln('kol-vo studentov dlya uborki');
  readln(m);
  otv := fact(n)/(Factm(m)*(Fact(n)-Factm(m)));
  write(otv);
end.

Автор: otshelnik9 29.5.2010, 17:53
Вроде всё работает но считает она не то что-то...

Автор: ФедосеевПавел 30.5.2010, 11:50
Ну, наверное формула другая...
Цитата(~FoX~ @  29.5.2010,  11:05 Найти цитируемый пост)
otv := fact(n)/(Factm(m)*(Fact(n)-Factm(m)));

а нужно
Код

otv := fact(n)/(Factm(m)*Fact(n-m));

Но, думаю, что это чрезчур неверно. Количество сочетаний это исключительно целое число.

Если определить otv как целое, то
Код
otv := (fact(n) div Factm(m)) div Fact(n-m);


При достаточно больших m и n будет переполнение разрядной сетки при вычислении факториала.
Тут для вычисления лучше подойдёт формула
      (n-m+1)(m+2)...(n-1)n
C:=-----------------------------
      1*2*3*...(m-1)m
И деление организовать целочисленное (DIV).
Цикл будет примерно таким
Код
...................................
VAR
    i, c : LongInt;
...................................
begin
...................................
  c:=1;
  for i:=1 to m do begin
    c:=(c*(n-i+1)) div i;
  end;
  WriteLn(c);
...................................
end.

Автор: LoveMeCozImBLONDE 30.5.2010, 22:58
По идее студенты то какбы пронумерованы,
потому та формула для количества комбинаций не прокатит)
з.ы. ето вроде бы)

Автор: otshelnik9 31.5.2010, 16:23
LoveMeCozImBLONDE прокатит так как грубо говоря  в програме есть просто 2 числа и оно должно вывести результат... 

Я предварительно расчитал вручную... Если n=4 а m=2 то результат должен выйти 6, о ткогда программа подсчитает правильно значит она работает...

Добавлено через 33 секунды
 ФедосеевПавел спасибо теперь всё работает...)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)