Число размещений без повторений и число сочетаний повторений подсчитывается по таким формулам: 
Применяя функцию вычисления факториала (см. задачу I), мы могли бы записать подсчет числа размещений или сочетаний при помощи одного оператора присваивания:
A:=f(n) div f(n-r) или C:=f(n) div (f*f(n - r)),
Чтобы уменьшить вероятность переполнения, создадим функции, непосредственно подсчитывающие число размещений и сочетаний. Кроме того, подсчитывая число сочетаний, мы будем опираться на известное тождество (например, вместо того, чтобы вычислять можем вычислить ) Составим 2 функции:
Код Function a (n,r:integer):integer; (*размещения*) Var aa, i: integer; begin aa:=1; For i:=n downto n-r+1 do aa:=aa*I; a:=aa; end; Код Function c (n,r:integer):integer; (*сочетания*) Var cc,i:integer; begin cc:=1; if n<2*r then r:=n-r; for I:=n downto n-r+1 do cc:=cc*i; for I:=1 to r do cc:=c div I; c:=cc; end; Составим программу для данных функции: ________
Код Function a(n,r:integer):integer; (* размещения *) Var aa,i:integer; begin aa:=1; For i:=n downto n-r+1 do aa:=aa*I; a:=aa; end;
Function c (n,r:integer):integer; (*сочетания*) Var cc,i:integer; begin cc:=1; if n<2*r then r:=n-r; for I:=n downto n-r+1 do cc:=cc*i; for I:=1 to r do cc:=cc div i; c:=cc; end;
var n,r:integer; begin n:=2; r:=3; Writeln(C(n,r)); Writeln(a(n,r)); Readln; end.
|