Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php]Czy podana liczba jest liczbą pierwszą?
b_chmura
post
Post #1





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


Panowie jak napisać skrypt który sprawdza czy podana liczba jest liczbą pierwszą?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
23kulpamens
post
Post #2





Grupa: Zarejestrowani
Postów: 57
Pomógł: 1
Dołączył: 11.10.2007

Ostrzeżenie: (0%)
-----


ponieważ nie ma skutecznego algorytmu odnajdywania wszystkich liczb pierwszych, najłatwiej chyba będzie jak zrobisz tablicę z pierwszoma kilkunatoma liczbami pierwszymi i sprawdzać czy liczba jest w tej tablicy. Któreś tam z koleii liczby pierwsze są tak duże że nikt ich chyba nie używa, a tych pierwszych pierwszych nie ma tak dużo winksmiley.jpg Poztym obliczanie czy liczba jest pierwsza za każdym razem pożerałoby dużo mocy obliczeniowej


--------------------
Ta sygnaturka to lekkie przegięcie. To poważne forum. Pomijam już fakt naruszenia regulaminu. Usuwam /~nospor/ szkoda :(
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


A jaka jest definicja libczy pierwszej? Jest to taka liczba ktora jest podzielna tylko przez 1 i przez sama siebie, no i oprocz 1ki.

Czyli sprawdzasz po kolei od 2 do N czy liczba N jest podzielna przez jakas inna liczbe. Oczywiscie mozna to zoptymalizowac.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Ertai
post
Post #4





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 14.12.2003

Ostrzeżenie: (0%)
-----


Jezeli masz podany zakres (gorne ograniczenie tych liczb) to mozesz sprawdzac czy dana liczba dzieli sie przez wszystkie od niej nizsze z reszta wieksza niz 0, jezeli dzieli sie tylko przez 1 z reszta rowna 0 to znaczy, ze masz liczbe pierwsza. (dzielenie z reszta to operacja modulo). Nie jest to oczywiscie najodpowiedniejszy algorytm ani najszybszy ale jest bardzo prosty do napisania.


--------------------
"Was that it?" - Ertai
Go to the top of the page
+Quote Post
b_chmura
post
Post #5





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


  1. <?php
  2. function liczbapierwsza($int)
  3. {
  4.  
  5. $czy = true;
  6. $i = 2;
  7. while($i < $int)
  8. {
  9. if($int % $i == 0)
  10. {
  11. $czy = false;
  12. }
  13. $i++;
  14. }
  15. return $czy;
  16. }
  17. ?>


nie chciało mi się myśleć
Go to the top of the page
+Quote Post
phpion
post
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Weź to zoptymalizuj trochę... Masz niepotrzebne przebiegi pętli. Zrób to tak:
  1. <?php
  2. function liczbapierwsza($int) {
  3. $i = 2;
  4.  
  5. while($i < $int) {
  6. if($int % $i == 0) {
  7. return false;
  8. }
  9.  
  10. $i++;
  11. }
  12.  
  13. return true;
  14. }
  15. ?>
Go to the top of the page
+Quote Post
b_chmura
post
Post #7





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


aż tak duże znaczenie ma jak zwracam false lub true?
Go to the top of the page
+Quote Post
phpion
post
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Nie jak tylko kiedy. Weźmy np. liczbę 999999. Twój kod wykona 999999 pętli po czym zwróci false. Mój natomiast wykona tylko 2 pętle (dla $i=2 oraz $i=3) i również zwróci false. Dlaczego? Ano dlatego, że Ty zwracasz prawdę/fałsz na końcu, po wykonaniu wszystkich pętli, natomiast u mnie zwracany jest fałsz przy pierwszym przypadku spełniającym dany warunek. Podobny efekt uzyskałbyś dając przy spełnieniu warunku instrukcję break; lub dodając do while'a && $czy === true.

Ten post edytował phpion.com 6.11.2007, 20:28:11
Go to the top of the page
+Quote Post
drPayton
post
Post #9





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Jeszcze prościej:
  1. <?php
  2. function is_prime($number)
  3. {
  4. foreach(range(2, $number-1) AS $test) {
  5. if($number%$test==0) {
  6. return false;
  7. }
  8. }
  9. return true;
  10. }
  11.  
  12.  
  13. echo (is_prime(29)) ? "liczba pierwsza" : "liczba nie jest pierwsza";
  14. ?>
Go to the top of the page
+Quote Post
phpion
post
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Prościej ale czy wydajniej? smile.gif foreach + range? smile.gif nie sądzę smile.gif
PS: aczkolwiek różnice wydajnościowe będą mikroskopijne ale jednak tongue.gif

Ten post edytował phpion.com 6.11.2007, 20:33:09
Go to the top of the page
+Quote Post
Gonzo44
post
Post #11





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 19.07.2007

Ostrzeżenie: (0%)
-----


1. Jeżeli dobrze pamiętam to nie trzeba dzielić przez wszystkie liczby od 2 do N-1, wystarczy do N/2 lub do (N-1)/2, z zaokrągleniem do całkowitych oczywiście.
2. Jeżeli coś nie jest podzielne przez 2 to nie jest też przez jej potęgi, to samo z 3, 5, 7...
Go to the top of the page
+Quote Post
cornholio666
post
Post #12





Grupa: Zarejestrowani
Postów: 472
Pomógł: 8
Dołączył: 14.03.2004
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


Witam,

ja jeszcze dorzucę ciekawy temat:

Sito Eratostenesa

Z powyższego linka:
  1. <?php
  2. /**
  3. * tworzy tablice z liczbami pierwszymi
  4. * @param integer zakres wyszukiwanych liczb pierwszych
  5. */
  6. function pierwsze($zakres){
  7. if(!is_numeric($zakres)) return array();
  8. $tablica=array_fill(0, $zakres, true); #wypelniamy tablice wartosciami true
  9. $tablica[0]=false; # 0 nie jest pierwsza
  10. $tablica[1]=false; # 1 nie jest pierwsza
  11. for($i=2; $i<=floor(sqrt($zakres)); ++$i){
  12. if(!$tablica[$i]) continue;
  13. $w=$i*$i;
  14. while($w<=$zakres){
  15. $tablica[$w]=false;
  16. $w+=$i;
  17. }  
  18. }
  19.  
  20. return array_keys($tablica, true); #zwracamy tablice z kluczami, ktore maja wartosc true
  21.  
  22. }
  23. ?>


Ten post edytował cornholio666 7.11.2007, 09:28:59


--------------------
I need TP for my bunghole!!!

Mój nowy przyjaciel - tytanowa płytka na stałe
------------------------------------------------------
AEGEE, kwiaciarnia rzeszów , notariusz rzeszów, zakład krawiecki rzeszów, paweł jakubowicz
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 04:28