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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2009, 18:03   #1
netcher
Пользователь
 
Регистрация: 04.02.2009
Сообщений: 21
По умолчанию Паскаль, факториал, рекурсия....

Написать программу с использованием рекурсии, для определения, сколько существует способов назначить дежурными трёх учеников в класе за формулой n!/(m!(n-m)!). Где n - количество черговых (3).
m - количество учеников в класе(30).

uses crt;
var n,m,w:integer;
y,q,j:longint;
e:real;
function F(x:integer):longint;
begin
if x=1 then F:=1
else F:=x*F(x-1);
end;
begin
clrscr;
write ('vvedite kilkist chergovih n=');
textcolor(2);
readln(n);
textcolor(7);
write('vvedite kilkist ychniv m=');
textcolor(2);
readln(m);
y:=F(n);
q:=F(m);
w:=n-m;
j:=F(w);
e:=y/(q*j);
textcolor(7);
writeln('vsego sposobov ',e);
readln;
end.

В этой программе выдает ошибку, помогите исправить...
netcher вне форума Ответить с цитированием
Старый 21.04.2009, 20:49   #2
netcher
Пользователь
 
Регистрация: 04.02.2009
Сообщений: 21
По умолчанию

по моему в программе выделяеться мало памяти на вычисление, если это так, то как это исправить?
netcher вне форума Ответить с цитированием
Старый 22.04.2009, 00:48   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) Вы ошиблись с формулой.
Посмотрите, у Вас в знаменателе получается отрицательное число, Вас это не смутило?
согласно wikipedia - Сочетание для Вашего случая будет формула:
m!/ (n! * (m-n)! )

2) Но обычных типов данных для Ваших расчётов банально не хватит (уж очень большие числа получаются)
Longint -2147483648..2147483647 Signed 32-bit
16! = 2004189184
уже 17! (=34071216128) не помещается в данный диапазон.
А Вам надо посчитать факториал 30! (а это, приблизительно будет 2.54085098357539646 * 10^28)
Для простоты решения можете просто использовать вещественные числа:
Код:
{$N+}
function F(x:extended):extended;
begin
 if x=1.0 then F:=1.0
 else F:=x*F(x-1);
end;
var
  Sochet : extended;
begin
  Sochet := F(30)/(F(3)*F(27));
  WriteLn('число сочетаний по 3 из 30 = ',trunc(Sochet):1);
end.

Последний раз редактировалось Serge_Bliznykov; 22.04.2009 в 00:52.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. рекурсия. числа. объясните, как работает код [silver beast] Помощь студентам 2 21.01.2009 05:00
Факториал Killbrum Софт 14 13.08.2008 00:34
Паскаль. Рекурсия. Лёха Помощь студентам 2 20.03.2008 22:54
Паскаль. Рекурсия Sergik1977 Помощь студентам 8 12.11.2007 17:08