Gotowy algorytm liczący sumę matematyczną

0

Hej,

nie mogę nigdzie znaleźć gotowego algorytmu liczącego sumę matematyczną (to duże takie E jakby). Mógłby mi ktoś pokazać jak takie coś zaimplementować ?

Chodzi mi dokładnie o zaimplementowanie tego wzoru:Image and video hosting by TinyPic

Jeśli chodzi o silnie, te wszystkie potęgi, pierwiastki to z tym nie ma żadnego problemu, po prostu nie wiem co zrobić z tą sumą...:(

Dane:
K = 40
n = 235
p ("ro") = 5

0

O takie \Sigma duże E Ci chodzi?

2

W sensie ze nie umiesz policzyc sumy? Sprobuj uzyc plusa

1
double suma = 1.0;
double skladnik = 1.0;
for(int n=1;n<K;n++)
{
    skladnik = skladnik*p/n;
    suma+=skladnik;
}
0

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...

0

Nie chce mi się szukać błędów w głupio napisanym kodzie. Wzoruj się na moim kodzie i wyrzuć funkcje Silnia oraz Potega.

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