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

Program spisujący liczby pierwsze

Object Storage Arubacloud
0 głosów
243 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,290 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,483 wizyt
pytanie zadane 7 września 2017 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 492 wizyt
pytanie zadane 29 listopada 2020 w Java przez zuzannaruda Nowicjusz (240 p.)
0 głosów
1 odpowiedź 1,113 wizyt

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...