Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obliczanie silni
Forum PHP.pl > Forum > PHP
bela
Jak obliczyć ile sto silnia ma zer?
Kiedyś miałem taki problem i nie mogłem go rozwiązać za pomocą kompa, musiałem ręcznie. Może wy znacie jakiś sposób smile.gif

[Edited: zmieniłem tytuł wątku, scanner]
rogrog
a w jaki sposób zrobiłeś to ręcznie? jak się da zrobić na papierze to na pewno da się napisać algorytm...
shpyo
rekurencja + przeszukanie wyniku (ile zer)

  1. <?php
  2.  
  3. function silnia( $intLiczba )
  4. {
  5. if($intLiczba == 0)
  6. {
  7. return 1;
  8. }
  9. else
  10. {
  11. return $intLiczba*silnia( $intLiczba-);
  12. }
  13. }
  14.  
  15. $wynik = silnia(100);
  16. for($i=0, $ile=strlen($wynik);$i<$ile;$i++)
  17. {
  18. if( $wynik[$i] == 0 )
  19. {
  20. $licznik++;
  21. }
  22. }
  23.  
  24. echo 'jest '.$licznik.' zer<br />';
  25.  
  26. ?>
bela
shpyo: a testowałeś ten kod? bo mi się wydaje że są pewne ograniczenia co do długości liczby typu integer

a ręcznie te robiłem tak biggrin.gif
mój kalk oblicza maksymalnie 17 silnia czy coś takiego, później daje notacje wykładniczą, więc brałem końcówke i mnożyłem ją przez kolejne liczby a ilość zer zapisywałem na kartce smile.gif
shpyo
testowałem, wyszło mi 20 tongue.gif

ale nie mam pojęcia jak ta liczba wygląda tongue.gif
rogrog
jeśli chodzi o liczbby to integer ma ograniczenia ale zawsze zostaje float a większymi limitami biggrin.gif

mi się zdawało że kod bezpośrednio obliczający będzie się dosyć wolno uruchamiał i/lub powodował błędy, ale skoro działa to ok biggrin.gif

jak napiszesz algorytm to przerzucienie go do php to banal tongue.gif winksmiley.jpg
shpyo
Cytat(bela_666 @ 2004-10-16 19:26:04)
a ręcznie te robiłem tak biggrin.gif
mój kalk oblicza maksymalnie 17 silnia czy coś takiego, później daje notacje wykładniczą, więc brałem końcówke i mnożyłem ją przez kolejne liczby a ilość zer zapisywałem na kartce smile.gif

hmmm, to z matematycznego punktu widzenia takie coś jest poprawne?
jak na mój rozum, to mnożenie części liczby (końcówki) nic nie da. A co jeżeli po pomnożeniu n*(n+1) gdzieś na początku pojawiło się zero (baaa, lub nawet zniknęło)? tongue.gif
bela
końcówka czyli jak miałem 3123178300 to zapisywałem zera i brałem 83 i dalej mnożyłem wyszło dobrze, lunter u ciebie wychodzi 17 wynik jest inny smile.gif
shpyo
właśnie sprawdzałem dla 1000, no i skrypcik Twój wymięka tongue.gif
bela
z tego co pamiętam to jest 24 albo 26 smile.gif
Vengeance
no to moze dasz zrodlo tego skryptu
netzah
  1. <?php
  2.  
  3. function silnia($l)
  4. {
  5. $s = '1';
  6.  
  7. for ($i=2; $i <= $l; $i++) {
  8. $s = bcmul($s, $i);
  9. }
  10.  
  11.  return $s;
  12. }
  13.  
  14. echo 'jest '. substr_count (silnia(100), &#092;"0\").' zer<br />';
  15.  
  16. ?>


bcmul nie ma zadnych ograniczen co do wielkosci smile.gif
shpyo
to mój skrypt działa nawet dobrze... a teraz będzie jeszcze lepiej tongue.gif bo znam juz teraz tą funkcję bcmul tongue.gif
netzah
Hmm, sorri. Dla mnie szukanie i takich, i takich nie ma sensu. Tak czy inaczej - sadzialem, ze bardziej chodzi tu o poprawne obliczenie silni - a to jest OK.
Ale z ciekawosci - wyjasnij mi, jaki jest sens z punktu widzenia matematycznego szukanie zer za cyframi znaczacymi?
bela
chciałem wiedzieć jak to zrobić w php, bo na kartce to zrobię, ale kiedyś miałem z tym problem winksmiley.jpg
tiraeth
Napisane na podstawie przykładu z książki "php 4. Tworzenie stron WWW. Ćwiczenia praktyczne" autorstwa Andrzeja Kierzkowskiego (wyd. Helion).

  1. <?
  2. // Tworzymy funkcję silnia
  3. function silnia($n)
  4. {
  5.  $silnia = 1;
  6.  // Wykorzystujemy pętlę for() do obliczenia silni
  7.  for($i=0; $o<=$n; $i++)
  8.  {
  9. $silnia *= $i;
  10.  }
  11.  
  12.  return $silnia;
  13. }
  14.  
  15. // Poniżej znajduje się przykład użycia
  16. $liczba = silnia(10);
  17. echo 'Silnia liczby 10 to: <b>'.$liczba.'</b>';
  18. ?>
shpyo
mam jeszcze jedno pytanie (bo chyba przespałem tą część tongue.gif) co to są te liczby znaczące?

@Tiraeth: ja już podałem funkcję (baaa, nawet jest rekurencyjnie).


pozdro,
shpyo
hawk
Cytat(Tiraeth @ 2004-10-19 19:54:31)
for($i=0; $o<=$n; $i++)

Jesteś pewny że ta książka jest godna polecenia?
biggrin.gif biggrin.gif biggrin.gif

A z tymi zerami i cyframi znaczącymi to was nie rozumiem... liczymy silnię czy szacujemy rząd wielkości? Bo jak szacujemy to może lepiej zacząc od jakiegoś przybliżenia silni?
Jabol
ile silnia z x ma zer? Nic prostszego. Pomyśl, kiedy powstaje zero:
- gdy mnożysz razy coś z końcówką 0
- gdy mnożysz razy coś z końcuwką 5-1 (ew. 5+1, jeżeli robisz od tyłu) a zaraz potem coś z końcówką 5 (a to czemu?) Bo np. mnożenie x*5 *4= x *20, czyli mnożenie przez liczbe z końcówką 0.
Zauważ, że zara się nie cofają.
tak więc raraz po prostu policz ile razy będziesz mnożył razy liczbę z końcówką 0 i razy 5
Tak więc zer będzie:
5, 10, 15, 20, 25 (dwa zera, bo 24*25= 600), 30, 35, 40, 45, 50 (dwa zera, bo na końcu jest i 5 i 0), 55, 60, 65, 70, 75 (dwa zera, bo, 75*76=5700) 80, 85, 90, 95, 100 (dwa zera)
W sumie 24 zera!
Pamiętaj, żeby coś wyliczyć w php musisz wiedzieć jak to wyliczyć naprawdę
Czyli taki algorytm wyglądałby mniej więcej (nie chce mi się teraz robić dokładnego matematycznego wywodu) tak:
dla <100 -> 23 zera
dla >=100 i <1000 -> 23 + 10 na każdą setkę
dla >=1000 i <10000 -> 23 + 20 na każdą setkę
albo po prostu liczysz tak:
robisz pętlę od 5, potem + 5 i tak aż do liczby mniejsze lub równej tej, dla której liczysz silnie.
for(x=5;x<=TWOJALICZBA;x+=5){...};
Dla każdej liczby liczysz + 1 jeżeli końy się na 0 (dla każdego zera + 1), 5 (tylko raz +1, nawet jeżeli jest np licznik 5555) lub 5 (wtedy kilka razy +1, bo za każde 0 i za 5) jest ostatnią cyfrą przed zerem. A jeżeli ostatnimi cyframi (ew. ostatnimi przed zerem) są 75 lub 25 to doliczasz dwa zera (i oczywiście za każde 0 +1).
No, to by było na tyle.
I pamiętaj, rzeby coś zrobić na komputerze musisz to najpierw umieć zrobić ręcznie.
bela
@Jabol: moja matematyczka w szkole liczyła tym sposobem i wyszło jej 22 biggrin.gif sądzę, że zapomniała o 25 i 75 dry.gif
A kto powiedział, że nie zrobiłem ręcznie biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.