Liczby Catalana

0

Witam, musze napisać program który policzy kolejne liczby catalana dla wyrazów od 0 do 10000. http://pl.wikipedia.org/wiki/Liczby_Catalana
Mam problem z przekroczeniem zakresu liczb, gdy licze dwumian newtona to wynik przekracza zakres nawet ulong...

Moj kod na razie wyglada tak:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ASD
{
    class Program
    {

        public static ulong Newton( uint n, uint k)      // Funkcja obliczająca symbol newtona
        {
            double Wynik = 1;       // Deklaracja zmiennej ( używamy double dla dokładności obliczeń )
 
            for( uint i = 1; i <= k; i++)   // Od 1 do k wykonujemy :
            {
                Wynik = Wynik * ( n - i + 1 ) / i;      // Obliczanie ze wzoru iteracyjnego
            }
            return (ulong) Wynik;      // Zwróć Wynik
        }

        
        public static ulong Catalan1(uint x)
        {
            ulong score = Newton(2 * x, x) / (x + 1);
            return score;
        }
        
        static void Main(string[] args)
        {

            Console.WriteLine(Catalan1(34));

                Console.ReadKey();
        }
    }
}

Dla wyrazu 34-tego program sie juz krzaczy... Macie jaki pomysl jak sobie poradzic z tym zakresem?

0

Tak na szybko polecam klase BigInteger: http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx

Ewentualnie w ramach cwiczenia mozesz sprobowac sam napisac cos podobnego :) Generalnie chodzi o to, ze jak liczba przekracza dopuszczalny zakres to ją rozbijasz na n mmniejszych, pamietajac, o tym, ze trzeba wszystkie potrzebne operatory matematyczne odpowiednio przepisac

Btw, wrzuc kod w znaczniki kolorujace skladnie, latwiej bedzie sie czytalo

0

Dzięki wielkie! Problem rozwiązany. Do BigInteger można wsadzić każdą liczbę całkowitą bez względu na jej rozmiar.

0

to raczej nie dziwne, że to pomogło: http://www.wolframalpha.com/input/?i=catalan+number+10000
dla 10000 wynik ma 6014 cyfr.

0

O kurde... racja... to co ja w takim wypadku moge zrobic? :)

0

Bo mi sie zdaje ze jednak ostateczny wynik chyba nie zawiera 6k liczb...

0
 Console.Writeline("Wynik zawiera {0} cyfr",myBigInteger.ToString().Lenght); //gdzie myBigInteger to twój wynik 

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