• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program spisujący liczby pierwsze

VPS Starter Arubacloud
0 głosów
278 wizyt
pytanie zadane 1 listopada 2022 w Java przez Magic19921057 Nowicjusz (120 p.)

Cześć

Mam taki problem, ponieważ zaczynam swoją przygodę z Java ale niestety średnio mi to idzie i nie rozumiem działania jednej pętli w programie wyszukującym liczby pierwsze w przedziale 2-100. Mianowicie chodzi o zagnieżdżoną pętle- nie rozumiem tego if z modulo, bo jeżeli i % j ==0, a każda pętla zaczyna się od tej samej wartość, tj. i=2, j=2 to przecież w każdym przypadku będzie isprime = false. Moglibyście mi to wytłumaczyć gdzie popełniam błąd w mysleniu?

W dodatku nie rozumiem warunku j <= i / j, dlaczego taki ma miejsce?

public class Test {
    //Napisz program wyszykujący wszystkie liczby pierwsze z przedziału 2 - 100
    public static void main(String[] args) {

        int i, j;
        boolean isprime;

        for (i = 2; i <= 100; i++){
            isprime = true;

           for (j = 2; j <= i / j; j++)
                if ((i % j) == 0) isprime = false;
            if (isprime)
                System.out.println(i + " jest liczbą pierwszą");

Z góry dzięki za pomoc i pozdrawiam

2
komentarz 1 listopada 2022 przez Oscar Nałogowiec (29,340 p.)
edycja 1 listopada 2022 przez Oscar

No nie, tylko na starcie zaczyna się od 2,2, potem już jest 3,2 itp. Zewnątrzna pętla to po prostu wyliczenie wszystkich liczb w zadanym przedziale, wewnętrzna pętla sprawdza czy dana liczba jest pierwsza poprzez sprawdzenie przez co się dzieli całkowicie.

Faktem jest, że ta druga pętla jest mocno nieoptymalna i trochę dziwnie wygląda ten warunek kontynuacji (j < i/j). Jeśli chodziło ci o warunek podobny do j < sqrt(i), czy nie prościej i czytelniej zapisac (j*j < i). Jednak ten warunek należy zapisać jako nieostry (<=), bo przecież są liczby które są kwadratami innych liczb pierwszych.

Jeśli program już ustali, że dana liczba nie jest pierwsza, nie ma sensu dalsze jej sprawdzanie. Czyli jak podstawiasz false pod is_prime to od razu break.

Tak dla jasności - do wyszukania wszystkich liczb pierwszych w danym zakresie najlepszy jest algorytm sita Erastotenesa.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
4 odpowiedzi 17,978 wizyt
pytanie zadane 7 września 2017 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 555 wizyt
pytanie zadane 29 listopada 2020 w Java przez zuzannaruda Nowicjusz (240 p.)
0 głosów
1 odpowiedź 1,296 wizyt

93,015 zapytań

141,978 odpowiedzi

321,271 komentarzy

62,358 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...