X
ďťż

Ładny brzuch

Poszukuje algorytmu lub poprostu wytłumaczenia na następujące pytanie:
Podaj ile zer ma na końcu liczba n!. Liczba n może być nieskończenie duża :D
Jak narazie obiło mi się o uszy, że to jest związane ze symbolem Newtona:
n!/(k!(n-k)!
Ale nie wiem jak to mam wyliczyć.

PS. Proszę nie piszcie mi jak wygląda obliczenie n! bo to wiem :P



Słuchaj, ile zer ma na końcu, to można sprawdzić liczba mod 10 czy kończy się zerem a potem sprawdzamy dla 100, 1000 itd.

program liczzera;
var
Liczba, x, reszta : Longint;
ilezer : Byte;
begin
readln(Liczba);
ilezer := 0;
x := 10;
reszta := Liczba mod x;
while (reszta = 0) do
begin
ilezer := ilezer+1;
x := x * 10;
reszta := Liczba mod x;
end;
writeln(ilezer);
end.

Ten program liczy, ile ma zer na końcu podana przez Ciebie liczba. Możesz uzyć tego sposobu w swoim programie.
Użytkownik Balcerowicz edytował ten post 27 luty 2005, 14:42

no spoko tylko malutki problem pojawia sie gdy n = 1000000000 albo wiecej :) wtedy prawdopodobnie obliczenia na statystycznym pc potrwaja rok i bedzie potrzebne troche duzo ramu :]

napisz do czego Ci to jest potrzebne to będzie łatwiej :) z symbolem Newtona to raczej nie ma nic wspólnego :)



takie cus powinno dzialac :) teraz tylko przerobic na brzydkiego pascala :P
#include <iostream> using namespace std; int main() {   size_t n;   cout << "podaj n: ";   cin >> n;   cin.ignore();   size_t zeros = 0;   for ( size_t i = n/5; i > 0; i /= 5 )      zeros += i;   cout << "ilosc zer na koncu " << n <<"! wynosi " << zeros;   cin.get();   return 0; }

n!= (n-1)!*n
i tak rekurencyjnie wywolujemy silnie. Tyle ze dla duzych n mozna wyczerpac pamiec.
Wartosci dla n=0, n=1, i powiedzmy n=2 warto byloby wpisac recznie.



no spoko tylko malutki problem pojawia sie gdy n = 1000000000 albo wiecej :) wtedy prawdopodobnie obliczenia na statystycznym pc potrwaja rok i bedzie potrzebne troche duzo ramu :]

Otóż, takie zadanie miałem na Mistrzostwach Polski w programowaniu, zrobiłem to metodą, że sprawdzałem którą wielkokrotnością 5 oraz 25 jest liczba n. Te zsumowane wielokrotności sumowałem i podawałem wynik. To dobrze działało tylko do bodajże kilku tysięcy (niepamiętam). Ostatnio takie zadanko widziałem w książce od matmy przy temacie o dwumianie Newtona. Więc to może trzeba zrobić tą metodą :unsure:

Proszę o zamknięcie tego tematu, ponieważ z pomocą już znalazłem odpowiedź na ten problem. Należy wypisać ilość liczb, w których jest 5 na końcu i pomnożyć to przez 2. W wyniku otrzymujemy m:=2n div 10, czy po skróceniu otrzymujemy m:=n div 5. Chyba taka postać jest poprawna :lol:


Proszę o zamknięcie tego tematu, ponieważ z pomocą już znalazłem odpowiedź na ten problem. Należy wypisać ilość liczb, w których jest 5 na końcu i pomnożyć to przez 2. W wyniku otrzymujemy m:=2n div 10, czy po skróceniu otrzymujemy m:=n div 5. Chyba taka postać jest poprawna  :lol:
no cos niebardzo to dziala:
25! = 15511210043330985984000000
25 div 5 = 5.
no ale w sumie jedno extra zero to jeszcze nie tragedia :)
looknij na moj kod powinien byc dobry :)
maly hint :) trzeba liczyc 5 ale w liczbie 25 sa juz dwie 5, twoj alogrytm tego nie uwzglednia...


no cos niebardzo to dziala:
25! = 15511210043330985984000000
25 div 5 = 5.
no ale w sumie jedno extra zero to jeszcze nie tragedia :)
looknij na moj kod powinien byc dobry :)
maly hint :) trzeba liczyc 5 ale w liczbie 25 sa juz dwie 5, twoj alogrytm tego nie uwzglednia...

przy 100! masz blad :]
w 100! liczac kolejne 5, [5,10,15,20,...] jest ich 20
w 25, 50, 75 i 100 jest jeszcze jedna gratisowa 5 wiec razem 24 zera na koncu 100!

125! na koncu ma 31 zer :)

przeanalizuj sobie moj progs, na razie nie znalazlem bledu wiec mozna zalozyc ze liczy dobrze :P

program ile_zer; uses crt; var i:integer; {to nam policzy zera} n:integer; {to nasza dana liczba} j:integer; {a to będzie nasz licznik pętli :) } begin ClrScr; WriteLn('Program liczący ilość zer na końcu silni podanej liczby'); Write('Podaj liczbę w której chcesz określić ilość zer: '); ReadLn(n); i:=0; for j:= 1 to n do begin  if j mod 5 = 0 then {tutaj sprawdzamy ile jest liczb podzielnych przez 5 od 1 do n}   i:=i+1; {jeżeli tak to zwiększamy i o jeden}  if j mod 25 = 0 then {a tu sprawdzamy czy przypadkiem ta liczba nie jest podzielna przez 25}   i:=i+1; {jeżeli tak to zwiększamy i o jeden} end; WriteLn('W silni podanej liczby występuje ', i, ' zer na końcu'); ReadKey; end.

pepsi -->> nie mogę się z tobą zgodzić jak chodzi o liczbę 125 :) występuje 30 a nie 31 zer. obliczenie jest banalne :)

100 ma 24 zera no to liczymy dalej

105, 110, 115, 120, 125, i jeszcze raz 125 bo jest podzielne przez 25. razem mamy takich liczb od 100 do 125 6 :)

setka miała 24 a 24 + 6 = 30 :)

wyżej zamieściłem program w pascalu. sprawdziłem działa :) lubię takie problemy natury kombinatorycznej :)

//edit

ale się nakombinowaliśmy. waśnie to wszystko przejżałem. przecież na to jest wzór!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!

podziel daną liczbę przez pięc następnie podziel ją przez 25 wyniki zsumuj i masz ilość zer :). no to teraz kod z poprawioną wersją :)

program ile_zer; uses crt; var i:integer; {to nam przechowa ilość zer} n:integer; {to nasza dana liczba} begin ClrScr; WriteLn('Program liczący ilość zer na końcu silni podanej liczby'); Write('Podaj liczbę w której chcesz określić ilość zer: '); ReadLn(n); i:=n div 5; i:=i + n div 25; WriteLn('W silni podanej liczby występuje ', i, ' zer na końcu'); ReadKey; end.

koniec programu :lol: a takie banalne było to rozwiązanie :)
Użytkownik j-mail edytował ten post 01 marzec 2005, 11:26

pepsi -->> nie mogę się z tobą zgodzić jak chodzi o liczbę 125 :) występuje 30 a nie 31 zer. obliczenie jest banalne :)

100 ma 24 zera no to liczymy dalej

105, 110, 115, 120, 125, i jeszcze raz 125 bo jest podzielne przez 25. razem mamy takich liczb od 100 do 125 6 :)

setka miała 24 a 24 + 6 = 30 :)
zmartwie cie ;) twoj program i rozumowanie jest zle :P
co do 100! to rzeczywiscie ma 24 zera
pozniej 5 wystepuje w 105 110 115 120 czyli kolejne 4 zera
ale w 125 wystepuja trzy piatki bo 5*5*5 = 125
wiec 125! ma 24+4+3 = 31 zer :P
przemysl, popraw progs, popatrz na moj kod, moze cie natchnie :)


zmartwie cie ;) twoj program i rozumowanie jest zle :P
co do 100! to rzeczywiscie ma 24 zera
pozniej 5 wystepuje w 105 110 115 120 czyli kolejne 4 zera
ale w 125 wystepuja trzy piatki bo 5*5*5 = 125
wiec 125! ma 24+4+3 = 31 zer :P
przemysl, popraw progs, popatrz na moj kod, moze cie natchnie :)

Pepsi, zwracam honor. Już zauważyłem swój błąd.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •  

    Drogi uzytkowniku!

    W trosce o komfort korzystania z naszego serwisu chcemy dostarczac Ci coraz lepsze uslugi. By moc to robic prosimy, abys wyrazil zgode na dopasowanie tresci marketingowych do Twoich zachowan w serwisie. Zgoda ta pozwoli nam czesciowo finansowac rozwoj swiadczonych uslug.

    Pamietaj, ze dbamy o Twoja prywatnosc. Nie zwiekszamy zakresu naszych uprawnien bez Twojej zgody. Zadbamy rowniez o bezpieczenstwo Twoich danych. Wyrazona zgode mozesz cofnac w kazdej chwili.

     Tak, zgadzam sie na nadanie mi "cookie" i korzystanie z danych przez Administratora Serwisu i jego partnerow w celu dopasowania tresci do moich potrzeb. Przeczytalem(am) Polityke prywatnosci. Rozumiem ja i akceptuje.

     Tak, zgadzam sie na przetwarzanie moich danych osobowych przez Administratora Serwisu i jego partnerow w celu personalizowania wyswietlanych mi reklam i dostosowania do mnie prezentowanych tresci marketingowych. Przeczytalem(am) Polityke prywatnosci. Rozumiem ja i akceptuje.

    Wyrazenie powyzszych zgod jest dobrowolne i mozesz je w dowolnym momencie wycofac poprzez opcje: "Twoje zgody", dostepnej w prawym, dolnym rogu strony lub poprzez usuniecie "cookies" w swojej przegladarce dla powyzej strony, z tym, ze wycofanie zgody nie bedzie mialo wplywu na zgodnosc z prawem przetwarzania na podstawie zgody, przed jej wycofaniem.