Liczby pierwsze - java

0

Mam za zadanie napisanie programu, który dla podanych liczb naturalnych wypisze je w kolejnych liniach z informacją czy jest to liczba pierwsza, czy nie.

Coś napisałem, proszę o sprawdzenie kodu pod względem wydajności, funkcjonalności, być może można coś dodać, przerobić

public class pierwsze 
        {        
                public static boolean prime(int n) 
                { 
                        if (n>2) 
                        { 
                        double sq = Math.sqrt(n); 
                        if(n%2==0) 
                        return false; 
                                else 
                                { 
                                for(int i=3; i<=sq; i+=2) 
                                        { 
                                                if(n%i==0) 
                                                { 
                                                return false; 
                                                } 
                                        } 
                                        return true; 
                                                } 
                                                } 
                else if (n==2) return true; 
                return false; 
                                } 
        
        
        public static void main(String args[]) 
        { 
        int n=0; 
        for(int i=0; i<args.length; i++) 
        { 
                try 
                { 
                        n=Integer.parseInt(args[i]); 
                        if (prime(n)) System.out.println(n + " jest liczba pierwsza"); 
                        else System.out.println(n + " nie jest liczba pierwsza"); 
                                } 
                                catch (NumberFormatException ex) 
                                { 
                                System.out.println(args[i] + " nie jest liczba calkowita"); 
                                }                      
                        } 
        } 
} 




 
0

Wygląda nieźle. Widzę dwie usterki:

  • co z liczbami ujemnymi
  • komunikat typu "222222222222222222222222222222222 nie jest liczba całkowitą" będzie wyglądał dziwnie.
0

Dla liczb ujemnych będzie wyświetlał się komunikat, że taka liczba nie jest liczbą pierwszą, natomiast dla ogromnych liczb .... coś tutaj należy zmienić, chyba, że dla takich liczb zakres zostaje przekroczony.

0
  • popraw formatowanie kodu (klamry, wcięcia)
  • nazwa klasy z reguły rozpoczyna się wielką literą
  • nazwa metody, zgodnie z konwencjami, powinna być "isPrime(int n)" -> bo zwraca boolean
  • komunikat dla wyjątku zmień na "nie jest poprawną liczbą typu integer"
0

Prócz tego coś jeszcze należałoby zmienić?
czy sposób znajdywania liczb pierwszych jest poprawny?

0
if(n<2) return false;
if(n%2==0) return n==2;
if(n%3==0) return n==3;
//if(n<25) return true;
for(i=5; i<=sq ; n=n+6){  // omijamy także krotności 3
    if(n%i==0) return false;
    if(n%(i+2)==0) return false;}
0

LooooooooooooooooooooooooooooooooooooooooooooooooooooooooooL
http://pl.wikipedia.org/wiki/Sito_Eratostenesa i masz tam nawet implementację w Javie.

0

ale sitem Eratostenesa raczej nie za bardzo będę w stanie wpisać odpowiednie liczby i wiedzieć, czy jest pierwsza, czy nie?

0

Jak to nie? Dostajesz zbiór liczb, wybierasz z nich największą i do jej wartości liczysz sito. Na koniec już tylko sprawdzasz czy jakaś liczba ze zbioru wejściowego została odsiana (jako pierwsza) czy skreślona.

0

Wybór, sito czy funkcja isPrime() powinien zależeć od ilości liczb, których "pierwszość" chcemy zbadać. Jeżeli n=15 485 857 (liczba jest pierwsza, i jest typu int), to czas wykonania funkcji isPrime(n) wynosi 0.2 ms., a czas stworzenia sita wynosi około 500 ms. Celowo wybrałem liczbę pierwszą, by sprawdzanie trwało długo. Ponieważ program uruchamiamy tak java pierwsze liczba1 liczba2 ..., to jest mało prawdopodobne by ilość liczb była duża. Uważam zatem użycia sita za nieuzasadnione.

1 użytkowników online, w tym zalogowanych: 0, gości: 1