Diskuze: Prvočísla v daném rozsahu
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Zdravim. Rozloz si to na podproblemy:
a. teoreticky
b. implementacne
Na vse se da dohledat na googlu navod. Pokud neco nedohledas, napis.
Zkus kouknout zde:
https://cs.wikipedia.org/wiki/Prvo%C4%8D%C3%ADslo
nastuduj si, jak urcit prvocislo. No a pak v programu jednoduse osetris, ze se prvocilo zacne pocitat od minimalni hranice az do te maximalni.
Co se tyka algoritmu pro hledani prvocisel tak se jeste pouziva https://cs.wikipedia.org/…vo_s%C3%ADto Je efektivnejsi nez pocitani odmocniny a nasledne deleni. Nicmene v tomto pripade kde je i dolni mez bude jeho efektivita nizsi a bude primo zaviset na nastaveni dolni meze, protoze algoritmus bude muset projit i cisla nizsi nez dolni mez.
Jak popsal petr sito je dobry, rychly, nicmene docela slozity (v kontextu polozene otazky). To co je na wiki je postacujici a myslim ze zakomponovat to do kodu bude docela jednoduche.
Myslím že tento kód (jde o konzolovou aplikaci - takže to tu dávám spíše aby jsi lépe pochopil jak na to) sice není úplně ideální, no ale třeba to pomůže:
package prvocisla;
import java.util.Scanner;
public class Prvocisla {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Zadej, od kterého čísla chceš vypsat prvočísla:");
int odcisla = sc.nextInt();
System.out.println("Zadej, do kterého čísla chceš vypsat prvočísla:");
int docisla = sc.nextInt();
int zbytek = 0;
int pocet = 0;
System.out.println();
for (int x = odcisla; x <= docisla; x++) {
pocet = 0;
for (int z = 1; z <= x; z++) {
zbytek = x%z;
if (zbytek == 0) {
pocet = pocet + 1;
}
}
if (pocet == 2) {
System.out.print(x + ", ");
}
}
}
}
Myslím že se asi dá pochopit jak funguje, zkrátka:
1. Nejprve potřebuješ uložit rozsah do dvou integerů, to
je snad jasné
2. Poté v si vytvoříš cyklus, ve kterém x na začátku
(nebo jiný integer) = hodnota dolní hranice rozsahu a podmínka je, že x
<= vrchní hranice rozsahu (snad chápeš proč <= a ne <, když by
uživatel zadal číslo které je prvočíslem tak by se ani do cyklu nedostalo
a nebylo by nakonec vypsáno)
3. V tom cyklu si vytvoříš další cyklus (třeba z, tak jak
v kódu výše), který bude začínat jedničkou a podmínkou bude to, že z
<= x (integerem z budeme dělit x (přes modulo %, který vrátí místo
výsledku zbytek) abychom zjistili kolik má číslo x dělitelů beze
zbytku)
4. Zjistíme zbytek při dělení integeru x integerem z přes
modulo (jak jsem napsal výše, funguje stejně jako / akorát vrátí zbytek
místo výsledku)
5. Pokud je zbytek 0, přidáme 1 do proměnné s počtem
dělitelů (kterou musíme na začátku prvního cyklu nastavit na 0 a ještě
před ním definovat)
6. Za tímto cyklem ale pořád v prvním cyklu zkontrolujeme,
jestli jsou dělitelé pouze dva a není jich více, pokud ano - číslo se
vypíše
Možná že jsem to popsal špatně (což je více než pravděpodobné), ale kód je funkční, takže máš alespoň příklad jak to může vypadat
Zobrazeno 6 zpráv z 6.