Silnia - pierwsza cyfra

Podzielność. Reszty z dzielenia. Kongruencje. Systemy pozycyjne. Równania diofantyczne. Liczby pierwsze i względnie pierwsze. NWW i NWD.
Dexous
Użytkownik
Użytkownik
Posty: 159
Rejestracja: 21 gru 2007, o 20:38
Płeć: Mężczyzna
Podziękował: 6 razy

Silnia - pierwsza cyfra

Post autor: Dexous »

Mam za zadanie napisac program w ktorym musze wyznaczyc pierwsza oraz ostatnia niezerowa cyfra silni.
Z druga czescia zadania sobie poradzilem ale z pierwsza dalej mam klopoty. Czy istnieje jakikolwiek sposob wyznaczyc dokladnie jaka jest pierwsza cyfra silni ?
Przykladowo uzytkownik wprowadza liczbe \(\displaystyle{ 56}\) , a program zwraca \(\displaystyle{ 7}\).

( \(\displaystyle{ 56! = 710998587804863451854045647463724949736497978881168458687447040000000000000}\) )

Czytalem troche o wzorze Strlinga, ale wyniki podobno nie sa dokladne.
Ostatnio zmieniony 17 wrz 2012, o 10:01 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Używaj LaTeXa do wszystkich wyrażeń matematycznych.
Awatar użytkownika
Zordon
Użytkownik
Użytkownik
Posty: 4977
Rejestracja: 12 lut 2008, o 21:42
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 75 razy
Pomógł: 910 razy

Silnia - pierwsza cyfra

Post autor: Zordon »

Ciężko to udowodnić, ale licząc na double'ach w taki sposób:

Kod: Zaznacz cały

int n=56;
double x=1;
for(int i=1;i<=n;i++)
{
		x*=i;
                while(x>10) x/=10;
}

printf("%d\n",(int)x);
uzyskasz poprawny wynik ;) (przynajmniej dla sensownie wielkich n)

edit:
Stirling też powinien zadziałać, liczysz logarytm dziesietny ze stirlinga, potem z tego mantyse - to bedzie logarytm z pierwszej cyfry (mniej więcej).
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

Silnia - pierwsza cyfra

Post autor: Althorion »

A jak się chce bardziej kombinować i nie używać double'i (jestem zdania, że jak się miało problem i użyło liczb zmiennoprzecinkowych, to teraz ma się 1,99999999999 problemów):
1. Użyć GMP dla liczb całkowitych dowolnej długości.
2. Użyć jakiegoś szybkiego algorytmu liczącego silnię ->

Kod: Zaznacz cały

http://www.luschny.de/math/factorial/FastFactorialFunctions.htm

3. Pierwsza cyfra to \(\displaystyle{ a_n = \frac{n!}{10^{\lfloor \log n! \rfloor}}}\). Ew. można skonwertować do stringa i wziąć pierwszą cyfrę, sprawdź co zadziała szybciej.
ODPOWIEDZ