Witam mam takie zadanie , i kompletnie nie mam pojęcia jak się za to zabrać , jeśli miałby ktoś chwilę i dałby rade pomóc to będę wdzięczny
Stosując iteracyjne obliczanie silni, oblicz wartość Dwumianu Newtona(n,k).
Wzór:
(n,k) = n!/(k!*(n-k)!)
Czy żeby to obliczyć potrzebujesz najpierw obliczyć silnie (iteracyjnie):
def silnia(n):
result := 1
for i := 1 to n do
result := result * i
return result;
Tutaj wartość matematyczna n!
będzie odpowiadać wywołaniu silnia(n)
.
A potem jak już masz silnie to możesz obliczyć swój dwumian (gotowca Ci nie podam to to już naprawdę nie wymaga dużego wysiłku). Powodzenia!
Dwumian przy pomocy silni mozesz tylko liczyc przy pomocy liczb typu BigInteger (Python ma to wbudowane). Wynika to z faktu ze powyzej liczby 19 konczy sie zakres integera.
Przeczytaj https://4programmers.net/Forum/C_i_C++/193687-program_obliczajacy_wartosc_symbolu_newtona?page=1
Masz obliczyć: ((n-k+1)*(n-k+2)*(n-k+3)*...*(n-2)*(n-1)*n)/(2*3*4*...*(k-1)*k)
W sumie dwie proste pętli.
W sumie można nawet na wbudowanych typach obliczać spore wartości:
#include <iostream>
using namespace std;
template<typename T> T GCD(T a,T b)
{
if((!a)||(!b)) return 1;
for(T t;b;a=b,b=t) t=a%b;
return a;
}
template<typename T> void DivGCD(T &a,T &b)
{
T div=GCD(a,b);
a/=div;
b/=div;
}
template<typename T> T multiply(T &value,T mul)
{
T save=value;
value*=mul;
if(value/mul!=save) cerr<<"Error: "<<save<<'*'<<mul<<endl;
}
template<typename T> T newton(T n,T k)
{
T mul=1,div=1;
for(T i=1;i<=k;++i)
{
T ni=n-k+i,ki=i;
DivGCD(ni,ki);
DivGCD(mul,ki);
DivGCD(div,ni);
multiply(mul,ni);
multiply(div,ki);
}
return mul/div;
}
int main()
{
for(int n=7;n<=30;++n)
{
for(int k=5;k<=n-5;++k)
{
cout<<newton(n,k)<<endl;
}
}
return 0;
}
Wladek12345 napisał(a):
Witam mam takie zadanie , i kompletnie nie mam pojęcia jak się za to zabrać , jeśli miałby ktoś chwilę i dałby rade pomóc to będę wdzięczny
Stosując iteracyjne obliczanie silni, oblicz wartość Dwumianu Newtona(n,k).
Wzór:
(n,k) = n!/(k!*(n-k)!)
Taka treść zadania, każe się zastanawiać, czy autor wie jak zrobić to lepiej.
Lepiej robi się tak:
http://www.luschny.de/math/factorial/FastBinomialFunction.html
albo inaczej, zakres nieograniczony (prawie)
jeszcze inaczej
unsigned long binomial (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; }
ja rozumiem że zadanko mocno związane z majzą, ale mimo wszystko może nie piszmy kodu jak matematycy ze zmiennymi
a b c d e f g h...
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.