Obliczanie symbolu Newtona dla dwóch liczb naturalnych z przedziału (0, 100>

0

Witam,
mam pewien problem, mianowicie mam napisać program, który ma obliczać wartość symbolu Newtona dla dwóch liczb naturalnych z przedziału (0,100>. Niby wszystko super ale pojawiają się dwa kłopoty:

  1. wzór działa tylko na małe liczby np. 9 po 4, ale już na takie jak 20 po 10 oblicza źle (wychodzi 11)
  2. czy moglibyście mi poradzić jakiego typu zmiennych mam użyć w programie bo gdy chce obliczyć np.90 po 76 (wynik to 9038619861406740) to jest to za duża liczba i wyskakuje błąd

Tu jest kod:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

function silnia(a: Longint): Longint;
 begin
   if a=0 then
 silnia := 1
else
 silnia := a*silnia(a-1);
 end;

var
k,n,wynik: LongInt;

begin
 Writeln('OBLICZANIE SYMBOLU NEWTONA');
 Writeln('--------------------------');
 Writeln('');
 Write('Podaj liczbę naturalną n z przedziału (0,100>:');
 Readln(n);
  while ((n<=0) or (n>100)) do
   begin
    Writeln('Liczba nie należy do przedziału');
    Write('Podaj liczbę jeszcze raz:');
    Read(n);
   end;
 Writeln('Podaj liczbę naturalną k z przedziału (0,100>');
 Write('i spełniającą warunek n>k:');
 Readln(k);
  while ((k<=0) or (n>100) or(n<k)) do
   begin
     Writeln('Liczba nie należy do przedziału lub nie spełnia warunku');
     Write('Podaj liczbę jeszcze raz:');
     Readln(k);
   end;
wynik := silnia(n)div ((silnia(k))*(silnia(n-k)));
 Writeln('Symbol Newtona (',n,' po ',k,')= ',wynik);
 readln;
end.

Z góry dzięki za pomoc.
Pozdrawiam
szamot

0

W Google jest mnóstwo przykładów dla obliczania symbolu Newtona z kodem w Pascalu...
Podpowiedź - Twoja funkcja silnia nie jest najlepsza;

  1. czy moglibyście mi poradzić jakiego typu zmiennych mam użyć w programie bo gdy chce obliczyć np.90 po 76 (wynik to 9038619861406740) to jest to za duża liczba i wyskakuje błąd

Tu jest problem, największy typ (64 bity) to Int64 - jeśli potrzebujesz większy wynik, niż 9.223.372.036.854.775.807 to trzeba będzie kombinować.

0

Nie musisz obliczać tego przez silnię, można obliczyć to przez trójkąt Pascala.
Poza tym Newton(K,N)=Newton(N-K,N) warto z tego skorzystać jeżeli K>N/2

0

NIe licz silnie bo przez nią przekraczasz zakres. Policz to tak:
{n \choose k} ={\frac{n}{1}\cdot\frac{n-1}{2}\cdot\frac{n-2}{3}}\cdot\cdots\cdot{\frac{n-k+1}{k}}

1 użytkowników online, w tym zalogowanych: 0, gości: 1