Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Co w tym skrypcei nie gra - liczby pierwsze
Forum PHP.pl > Forum > PHP
kiler129
  1. <?
  2. $liczba = $_GET['nr'];
  3.  
  4. $ile = '0';
  5. $x = '1';
  6.  
  7. while($x <= $liczba && $ile <= '2')
  8. {
  9.  $policz = $liczba/$x;
  10. if(substr_count($policz,'.') == '0');
  11. {
  12.  $ile++;
  13. } 
  14.  $x++;
  15. unset($policz);
  16. }
  17.  
  18. echo $ile.'<br>'.$x;
  19.  
  20. ?>


Tak z nudow napisalem, zwraca zawsze 3<br>4 jesli liczba wieksza lub rowna 3.

Co tu nie gra ?



p.s. Jest na liczby piwersze jakis szybszy algorytm ?
pbnan
Wykorzystaj algorytm sito Eratostenesa. Bardzo ciekawy, zapoznaj się znim smile.gif
Spawnm
  1. <?php
  2. if(substr_count($policz,'.') == '0');
  3. {
  4.  $ile++;
  5. }
  6. ?>


po co daleś na koniec ";" w if() questionmark.gif
to może byc błędem:P
Masov
moze sie myle...ale dzielenie modulo wydaje mi sie lepszym sposobem na sprawdzenie czy liczba jest podzielna czy nie snitch.gif
kiler129
Co do ; za if to to bylo to !
Skrypt wyglada tak:

  1. <?
  2. $liczba = $_GET['nr'];
  3.  
  4. if($liczba == '0' || !isset($_GET['nr']) || strlen($liczba) <= '0')
  5. {
  6. return(print "<body bgcolor=red><center><body bgcolor=red><font color=white size=15><b>Blad! <br> Nie podano liczby do sprawdzenia !</b></font></center></body>");
  7. }
  8.  
  9.  
  10. $ile = '0';
  11. $x = '1';
  12.  
  13. while($x <= $liczba && $ile <= '2')
  14. {
  15.  $policz = $liczba/$x;
  16. if(substr_count($policz,'.') == '0')
  17. {
  18.  $ile++;
  19. } 
  20.  $x++;
  21. unset($policz);
  22. }
  23.  
  24. if($_GET['dbg'] == '1')
  25. {
  26. echo 'Dzielnikow: '.$ile.'<br>Krokow: '.$x;
  27. }
  28.  
  29. if($ile == '2' && $x != $ile)
  30. {
  31. print "<body bgcolor=green><center><body bgcolor=white><font color=white size=15><b>BRAWO !<br>".$liczba."<br>jest liczba pierwsza !<b></font></center></body>";
  32. }
  33. else
  34. {
  35. print "<body bgcolor=orange><center><body bgcolor=white><font color=white size=15><b>Niestety <br>".$liczba."<br> nie jest liczba pierwsza<b></font></center></body>";
  36. }
  37. ?>


Podkoloryzowalem go troche smile.gif
Uzycie:

Kod
licz.php?nr=11&dbg=1 - pokazuje ze liczba 11 jest liczba pierwsza dodtakowo potwerdzajac to pokazuje ile bylo dzielen i ile znaleziono dzilnikow
licz.php?nr=11&dbg=1 -  pokazuje ze liczba 10 nie jest liczba pierwsza dodtakowo potwerdzajac to pokazuje ile bylo dzielen i ile znaleziono dzilnikow
licz.php?nr=11 - pokazuje ze liczba 11 jest liczba pierwsza
licz.php?nr=11 -  pokazuje ze liczba 10 nie jest liczba pierwsza
liicz.php -  Wykazuje ze nie wprowadzono liczby



Co do sposobu - ten byj najprostrzy biggrin.gif
Teraz glowie sie jak w php liczyc pi - ktos ma pomysl ?
Spawnm
pi??czyli pierwiastek:) sqrt() smile.gif
pbnan
Łaktus: stała PI, czyli 3.14159265358979...

kiler, masz kilka sposobów: http://pl.wikipedia.org/wiki/Pi#Wzory_do_obliczania_liczby
smile.gif
Ale chyba nie wyjdzie Ci nic lepszego, niż to, co masz w zmiennej M_PI... //Tfu, stałej M_PI
kiler129
Tak ale ja chce liczyc i ustalac ile miejsc po przecinku ma sie pojawic winksmiley.jpg

Zrobilem jeszce jeden skrypt, podaje sie zakres i on znajduje liczby pierwsze z tego zakresu smile.gif

  1. <?
  2. function getmicrotime(){ 
  3. list($usec, $sec) = explode(" ",microtime()); 
  4. return ((float)$usec + (float)$sec); 
  5. }
  6.  
  7. $start = getmicrotime();
  8.  
  9.  
  10. function check($liczba, $s, $tlp, $lzp='0')
  11. {
  12.  if($lzp == '1')
  13. {
  14.  $liczba = pow('2', $liczba);
  15. }
  16.  
  17.  
  18.  if($liczba == '0' || strlen($liczba) <= '0')
  19.  {
  20. if(isset($liczba))
  21.  {
  22.  $err = '1';
  23.  $bl = '1';
  24.  }
  25.  }
  26.  
  27. if($s == '1' && $bl != '1')
  28. {
  29.  $ile = '0';
  30.  $x = '1';
  31.  
  32.  while($x <= $liczba && $ile <= '2')
  33.  {
  34.  $policz = $liczba/$x;
  35.  if(substr_count($policz,'.') == '0')
  36. {
  37.  $ile++;
  38. } 
  39.  $x++;
  40.  unset($policz);
  41. }
  42.  
  43.  if($dbg == '1')
  44. {
  45.  echo 'Dzielnikow: '.$ile.'<br>Krokow: '.$x;
  46. }
  47.  
  48.  if($ile == '2' && $x != $ile)
  49. {
  50.  echo '<b>Liczba '.$liczba.' jest liczba pierwsza !</b></br>';
  51. }
  52. else
  53. {
  54.  if($tlp != 'tak')
  55. {
  56.  echo 'Liczba '.$liczba.' nie jest liczba pierwsza<br>';
  57. }
  58. }
  59. }
  60.  if($err == '1') { echo '<u><i>Liczba '.$liczba.' jest nieprawidlowa</i></u><br>'; }
  61. }
  62.  
  63. if($s2 == '1')
  64. {
  65.  $od = $_GET['od'];
  66.  $do = $_GET['do'];
  67.  $x = $od;
  68.  
  69.  while($x <= $do)
  70. {
  71.  check($x, '1', $_GET['tlp']);
  72.  $x = $x+1;
  73. }
  74. }
  75. else
  76. {
  77. echo '
  78. <FORM ACTION="" METHOD="GET">
  79.  <P>
  80. Podaj zakres: <br>
  81. Od <INPUT TYPE="TEXT" NAME="od"><BR>
  82. Do <INPUT TYPE="TEXT" NAME="do"><BR>
  83. Pokaz tylko liczby pierwsze <INPUT TYPE="checkbox" NAME="tlp" VALUE="tak"><br>
  84.  </P>
  85. <INPUT TYPE="hidden" NAME="s2" value="1">
  86. <INPUT TYPE="SUBMIT" VALUE="Szukaj !">
  87. </FORM>';
  88. }
  89.  
  90. $koniec = getmicrotime();
  91.  
  92. echo '<center><br><br><hr>Liczono '.($koniec - $start).' sekund<br><b><font color=red>Autor: Grzegorz Zdanowski</b></font></center>';
  93. ?>


p.s. Ja ci dam zmiennej haha.gif
Hazel
Może przyda Ci się coś takiego (funkcja podaje pi do tylu miejsc po przecinku, ile jej podasz)
  1. <?php
  2. function zaokraglij_pi ($rzad)
  3. {
  4. $pi = M_PI * pow(10, $rzad);
  5. $pi = M_PI / pow(10, $rzad);
  6. return $pi;
  7. }
  8. ?>


Jeśli ten post w niczym Ci nie pomaga, a może nawet nie dotyczy tematu, to go olej, jestem na tyle zmęczony że nie bardzo wiem, o co Ci chodzi...

added: mam wrażenie, że w temacie w ogóle nie o to chodzi i niepotrzebnie ten kod pisałem, ale nie jestem pewien tongue.gif
phpion
OT: sorry, ale jak można obliczyć pi? smile.gif
Hazel
Średnica okręgu przez jego długość? blinksmiley.gif dry.gif
phpion
Heh, to może ujmę to inaczej: PO CO liczyć wartość TT? Nie wiem, może Giertych coś zmienił, ale mnie uczono, że jest to niezmienna wartość ~3,14...
pbnan
Wg manuala snitch.gif
  1. <?php
  2. //bcpi function with Gauss-Legendre algorithm
  3. //by Chao Xu (Mgccl)
  4. function bcpi($precision){
  5. $limit = ceil(log($precision)/log(2))-1;
  6. bcscale($precision+6);
  7. $a = 1;
  8. $b = bcdiv(1,bcsqrt(2));
  9. $t = 1/4;
  10. $p = 1;
  11. while($n < $limit){
  12. $x = bcdiv(bcadd($a,$b),2);
  13. $y = bcsqrt(bcmul($a, $b));
  14. $t = bcsub($t, bcmul($p,bcpow(bcsub($a,$x),2)));
  15. $a = $x;
  16. $b = $y;
  17. $p = bcmul(2,$p);
  18. ++$n;
  19. }
  20. return bcdiv(bcpow(bcadd($a, $b),2),bcmul(4,$t),$precision);
  21. }
  22. ?>
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.