[Pascal] Jak liczyć symbol Newtona?

0

Samo zadanie jest banalne... ale gdy trzeba policzyć n po k dla n większych niż 50 wynik wychodzi poza zakresy liczb całkowitych w pascalu (moznaliczyć w extended ale tylko 20 cyfr jest prawidłowe).

pierwsza komórka w tablicy to 1, potem kolejno mnożę przez 2, 3, 4... aż do n z przenoszeniem do następnej komórki. (wiem wiem, można mnożyć od n-k+1 do n a potem będę chciał dzielić stopniowo przez 2, 3, 4 aż do k).

Dobra ale zajmijmysię na razie TYLKO SILNIĄ.

Mnożenie mogę robić od 1 do 2000 komórki, ale chcę zrobić małą procedurkę, która policzy ile komórek jest zajętych, ale chce żeby działała szybko (bo mogę zrobić że zmniejsza x z 2000 aż A[x] będzie <>0, ale to jest czasochłone [w znaczeniu że program bedzie długo liczył]). Najlepiej byłoby tą procedurkę połączyć z przenoszeniem, ale moje dotychczasowe pomysły były poprawne tylko dla kilku pierwszych silni.

Czy macie jakieś pomysły jak to szybciej, wydajniej, efektywniej zrobić?

Pomysły odnośnie N po K też mile widziane :)

A[1]:=1;
        x:=1;
        for i:= 1 to n do
                begin
                for j:= 1 to x do A[j]:=A[j]*i;

                x:=0;
                REPEAT
                inc(x);
                IF A[x]>9 THEN
                        begin
                        A[x+1]:=A[x+1]+(A[x] div 10);
                        A[x]:=A[x] mod 10;
                        end;
                UNTIL ????????;
              end;

No właśnie UNTIL co? Macie jakieś pomysły?

0

No dobra to mże zadam ogólniejsze pytanie... Jak najlepiej liczyć Symbol Newtona?

0

co do silni to zobacz: Silnia - szybkie DIV i MOD

co do Newtona:

unsigned long ncomb1 (int n, int m)
{
      unsigned long cnm = 1UL;
      int i;

      if (m*2 >n) m = n-m;
      for (i=1 ; i <= m; n--, i++)
            cnm = cnm * n / i;
      return cnm;
}

// albo
unsigned long ncomb2 (int n, int m)
{
      unsigned long cnm = 1UL;
      int i, f;

      if (m*2 >n) m = n-m;
      for (i=1 ; i <= m; n--, i++)
      {
            if ((f=n) % i == 0)
                  f   /= i;
            else  cnm /= i;
            cnm *= f;
      }
      return cnm;
}
0

Elo. Jestem totalnym żółtodziobem jeśli chodzi o Delphi, ale muszę zaprogramować symbol Newtona i totalnie nie wiem jak się za to zabrać. Prosiłbym o pokazanie procedury jak ma to wyglądać. Dodam tylko że parametry n, k wprowadzam z klawiatury, pola edycyjne i reszta są porobione tylko procedury brak. Pozdro.

[glowa]

0

jak zadanie domowe to za ile ??

0

przecież post wyżej jest kod z odpowiedzią, przepisanie do delphi to kilka minut! szczyt lenistwa!

0
ŁF napisał(a)

przecież post wyżej jest kod z odpowiedzią, przepisanie do delphi to kilka minut! szczyt lenistwa!

ano szczyt, tylko, że kod powyżej to C ;-)

0
zbynio_k napisał(a)

ano szczyt, tylko, że kod powyżej to C ;-)
no i? jest z tego powodu gorszy? przecież napisałem, że przepisanie to kwestia kilku minut, więc nie spamuj.

0

A skąd założenie, że pytający zna C? Fakt, że „wypada rozumieć C” niezależnie w czym się na codzień pisze, ale nie wymagajmy tego od początkujących, który zaczynają od języka o innej składni nie wywodzącej się historycznie z C.

0

gdzie założyłem, że zna C? popatrz sam na ten kod, co tam jest nie do zrozumienia? że / na intach jest jak div? to podpowie kompilator. a *=, % czy /= to chwila moment z wyszukiwarką. coś jeszcze? jakieś niezrozumiałe typy danych? a może wskaźniki? to może chociaż tablice?

chociaż... jeśli lukaslc4 nie umie użyć google + symbol newtona delphi, to tym większy problem może mieć z /= i resztą... co nie zmienia faktu, że każdy myślący, nawet początkujący programista, potrafiłby samodzielnie to przepisać (choć nie w 5 minut). a bezmyślnym programistom nie mam ochoty pomagać.

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