Написать программу вычисления числа сочетаний из m элементов по n - Pascal
Формулировка задачи:
Доброго времени суток!
Вот,дали,вроде, не сложную задачу:Написать программу вычисления числа сочетаний из m элементов по n (n≤m) Сmn = m!/n!(m-n)!, где m и n вводятся с клавиатуры, используя рекуррентную формулу Cm0 =1,Cmn = (m-n+1)/n*Cmn-1
Вроде все работает нормально,кроме нахождения Cmn = (m-n+1)/n*Cmn-1.Неправильно считает(при правильных значениях M и N).Кому не сложно,посмотрите что не так.Заранее спасибо!
Вот что получилось:
Вот что выдает паскаль:
N=3
M=6
M/(N*(M-N))=20
Fac(N)=6Fac(M)=720Fac(M-N)=6
Cm0:=60(а должно быть 15)
Fac(N)=2Fac(M)=720Fac(M-N)=6
Cmn=80(а должно быть 20)
var N,M,Cmn:integer; function Fact(x:integer):longint; begin if x <= 1 then fact := 1 else fact := x * fact(x - 1); end; begin Write('N='); readln(N); Write('M='); readln(M); writeln('M/(N*(M-N))=',Fact(M)div(Fact(N)*Fact(M-N))); writeln('Fact(N)=' ,Fact(N) ,'Fact(M)=' ,Fact(M) ,'Fact(M-N)=' ,Fact(M-N)); writeln('Cm0:=',(Fact(M)div(Fact(N-1)*Fact(M-N)))); writeln('Fact(N)=' ,Fact(N-1) ,'Fact(M)=' ,Fact(M) ,'Fact(M-N)=' ,Fact(M-N)); writeln ('Cmn=' , ((M-N+1)/(N))*(Fact(M)div(Fact(N-1)*Fact(M-N)))); end.
Решение задачи: «Написать программу вычисления числа сочетаний из m элементов по n»
textual
Листинг программы
C:=1; for i:=1 to N do C:=((M-i+1) div i)*C;
Объяснение кода листинга программы
- Создается переменная
C
и ей присваивается значение 1. - Запускается цикл
for
от 1 доN
(включительно). - Внутри цикла переменной
C
присваивается новое значение, которое вычисляется как результат деления с округлением в меньшую сторону от выражения((M-i+1) div i)*C
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д