bela
16.10.2004, 15:24:33
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
[Edited: zmieniłem tytuł wątku, scanner]
rogrog
16.10.2004, 17:15:02
a w jaki sposób zrobiłeś to ręcznie? jak się da zrobić na papierze to na pewno da się napisać algorytm...
shpyo
16.10.2004, 17:33:50
rekurencja + przeszukanie wyniku (ile zer)
<?php
function silnia( $intLiczba )
{
if($intLiczba == 0)
{
return 1;
}
else
{
return $intLiczba*silnia( $intLiczba-1 );
}
}
$wynik = silnia(100);
for($i=0
, $ile=strlen($wynik);$i<$ile;$i++) {
if( $wynik[$i] == 0 )
{
$licznik++;
}
}
echo 'jest '.$licznik.' zer<br />';
?>
bela
16.10.2004, 18:26:04
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

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
shpyo
16.10.2004, 20:52:11
testowałem, wyszło mi 20

ale nie mam pojęcia jak ta liczba wygląda
rogrog
16.10.2004, 21:04:07
jeśli chodzi o liczbby to integer ma ograniczenia ale zawsze zostaje float a większymi limitami

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

jak napiszesz algorytm to przerzucienie go do php to banal
shpyo
16.10.2004, 21:14:14
Cytat(bela_666 @ 2004-10-16 19:26:04)
a ręcznie te robiłem tak

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

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)?
bela
16.10.2004, 21:58:49
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
shpyo
17.10.2004, 08:16:46
właśnie sprawdzałem dla 1000, no i skrypcik Twój wymięka
bela
17.10.2004, 13:05:32
z tego co pamiętam to jest 24 albo 26
Vengeance
17.10.2004, 17:08:42
no to moze dasz zrodlo tego skryptu
netzah
18.10.2004, 07:28:41
<?php
function silnia($l)
{
$s = '1';
for ($i=2; $i <= $l; $i++) {
$s = bcmul($s, $i);
}
return $s;
}
?>
bcmul nie ma zadnych ograniczen co do wielkosci
shpyo
18.10.2004, 09:03:15
to mój skrypt działa nawet dobrze... a teraz będzie jeszcze lepiej

bo znam juz teraz tą funkcję
bcmul
netzah
19.10.2004, 08:52:36
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
19.10.2004, 12:52:56
chciałem wiedzieć jak to zrobić w php, bo na kartce to zrobię, ale kiedyś miałem z tym problem
tiraeth
19.10.2004, 19:54:31
Napisane na podstawie przykładu z książki "php 4. Tworzenie stron WWW. Ćwiczenia praktyczne" autorstwa Andrzeja Kierzkowskiego (wyd. Helion).<?
// Tworzymy funkcję silnia
function silnia($n)
{
$silnia = 1;
// Wykorzystujemy pętlę for() do obliczenia silni
for($i=0; $o<=$n; $i++)
{
$silnia *= $i;
}
return $silnia;
}
// Poniżej znajduje się przykład użycia
$liczba = silnia(10);
echo 'Silnia liczby 10 to: <b>'.$liczba.'</b>'; ?>
shpyo
19.10.2004, 22:33:49
mam jeszcze jedno pytanie (bo chyba przespałem tą część

) co to są te liczby znaczące?
@Tiraeth: ja już podałem funkcję (baaa, nawet jest rekurencyjnie).
pozdro,
shpyo
hawk
20.10.2004, 08:34:29
Cytat(Tiraeth @ 2004-10-19 19:54:31)
for($i=0; $o<=$n; $i++)
Jesteś pewny że ta książka jest godna polecenia?
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
20.10.2004, 13:31:50
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
20.10.2004, 18:27:45
@Jabol: moja matematyczka w szkole liczyła tym sposobem i wyszło jej 22

sądzę, że zapomniała o 25 i 75
A kto powiedział, że nie zrobiłem ręcznie