Dobra Panowie,
tak wygląda to co mam teraz:
class Program
{
static void Main(string[] args)
{
var k = 40;
var n = 235;
var p = 5;
// liczenie wzoru P(n)
BigInteger pnLicznik = Potega(p,n);
BigInteger pnMianownik = Potega(k, (n-k)) * Silnia(k) ;
// liczenie wzoru P(0)
//---prawa strona
BigInteger pk = Potega(p, k);
BigInteger silniaK = Silnia(k); //liczenie K! z mianownika
BigInteger nawias = new BigInteger(1 - (p/k)); //liczenie nawiasu po silni
BigInteger prawaMianownik = silniaK*nawias; //liczenie mianownika ułamka po prawej stronie "plusa"
BigInteger prawacalosc = pk/prawaMianownik; //liczenia całej prawej strony "plusa"
//---lewa strona
BigInteger suma = Suma(k, p, n);
BigInteger p0Mianownik = suma + prawacalosc;
BigInteger p0Calosc = 1/(p0Mianownik);
BigInteger wynik = (pnLicznik*p0Calosc)/pnMianownik;
Console.WriteLine(wynik);
Console.ReadKey();
}
static BigInteger Suma(int k, int p, int n)
{
BigInteger suma = new BigInteger();
var fin = k - 1;
for (int i = 1; i < fin; i++)
{
suma += Ulamek(Potega(p, i), Silnia(n));
}
return suma;
}
static BigInteger Potega(int podstawa, int wykladnik)
{
return BigInteger.Pow(podstawa, wykladnik);
}
static BigInteger Silnia(int k)
{
if (k < 1)
return 1;
else return k*Silnia(k - 1);
}
static BigInteger Ulamek(BigInteger licznik, BigInteger mianownik)
{
return BigInteger.Divide(licznik, mianownik);
}
}
Błąd polega na tym że jak we wzorze dla P(0) robię ten ostatni ułamek p/k to wychodzi mi tam double, a ponieważ operuję na BigInteger no to chyba coś tu się miesza - czy mógłbym prosić o wskazanie błędu?
[EDIT]
To co teraz spróbowałem pozmieniać to zamiast BigInteger użyć BigRational (http://bcl.codeplex.com/wikipage?title=BigRational&referringTitle=Home) oraz dodatkowo wszystkie działania robić za pomocą funkcji w tym typie BigRational i teraz wygląda to tak:
class Program
{
static void Main(string[] args)
{
var k = 40;
var n = 235;
var p = 5;
// liczenie wzoru P(n)
BigRational pnLicznik = BigRational.Pow(p, n);
BigRational pnMianownik = BigRational.Pow(k, (n - k)) * Silnia(k);
// liczenie wzoru P(0)
//---prawa strona
BigRational pk = Potega(p, k);
BigRational silniaK = Silnia(k);
BigRational nawias = (BigRational.Subtract(1, BigRational.Divide(p, k)));//new BigInteger(1 - (p/k));
BigRational prawaMianownik = BigRational.Multiply(silniaK, nawias);
BigRational prawaCalosc = BigRational.Divide(pk, prawaMianownik);
//---lewa strona
BigRational suma = Suma(k, p, n);
BigRational p0Mianownik = suma + prawaCalosc;
BigRational p0Calosc = 1 / (p0Mianownik);
BigRational wynik = (pnLicznik * p0Calosc) / pnMianownik;
Console.WriteLine(wynik);
Console.ReadKey();
}
static BigRational Suma(int k, int p, int n)
{
BigRational suma = new BigRational();
var fin = k - 1;
for (int i = 1; i < fin; i++)
{
suma += BigRational.Divide(BigRational.Pow(p, i), Silnia(n));
}
return suma;
}
static BigRational Potega(int podstawa, int wykladnik)
{
return BigRational.Pow(podstawa, wykladnik);
}
static BigRational Silnia(int k)
{
if (k < 1)
return 1;
else return BigRational.Multiply(k, Silnia(k - 1));// k*Silnia(k - 1);
}
static BigRational Ulamek(BigRational licznik, BigRational mianownik)
{
return BigRational.Divide(licznik, mianownik);
}
}
Niestety jednak dostaję błąd w funkcji Suma na linijce w pętli for: DevidedByZeroException :(
Takie NEWBIE a jednak jakoś nikt nie rozwiązuje...