Diskuze: Eratosthenovo síto
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 14 zpráv z 14.
//= 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.
package eratosthenovo_sito;
public class Eratosthenovo_sito {
public static void main(String[] args) {
int[] pole = new int[19];
int[] pole2 = new int[19];
boolean konPruchod = true;
for (int i = 0; i <= 18; i++) {
pole[i] = i + 2;
}
int prvocisla = pole[0];
int prvocisla2;
for (int i = 0; i <= 18; i++) {
if (pole[i] % prvocisla != 0) {
pole2[i] = i + 2;
if (konPruchod == true) {
if (pole2[i] % 2 != 0) {
prvocisla2 = pole2[i];
konPruchod = false;
}
}
}
}
for (int i = 0; i <= 18; i++) {
if (pole[i] % 2 != 0) {
System.out.println(pole2[i]);
}
}
}
}
Předně změn svůj přístup k pojmenovávání proměnných - pole, pole2
- to je cesta do pekel, pojmenuj to tak ať na první pohled víš co to
obsahuje.
A za druhé použij místo obyčejných polí kolekce - List<Integer> a
konkrétně ArrayList se přímo nabízí.
Ja vim ale píšu že to použít nemůžu
Můžu ti sem hodit jednoduchou C implementaci (původně nad bitovým polem)..
int pole[n] = { 0, }; // pole nul
int i = 2;
while (i <= sqrt(n))
{
while (pole[i] != 0) // přeskakuje všechna neprvočísla (ty jsou v pole označena 1)
i++;
// označí všechny násobky nalezeného prvočísla, že nejsou prvočíslo
for (int j = 2*i; j < n; j += i)
{
pole[j] = 1;
}
i++;
}
Vykuchal jsem z toho makra pro práci s bit polem, takže to ber jen referenčně. Funguje to prakticky tak, že začneš 2 (první prvočíslo) a v nějakém poli (pro efektivitu se používá bitové pole, tu je obyč pole intů) označíš všechny neprvočísla (tj. 4,6,8,...).
Pak se posuneš na další index - 3 je prvočíslo, označíš všechny násobky (6, 9, 12, ...) za neprvočísla. Další je 4 - mrkneš do pole a vidíš, že to není prvočíslo -> i++. Dále máš 5, atd.
Přepsat to do Javy by neměl být problém
Díky moc určitě mi to pomůže
Tk bohužel příliš nepomohlo.... Ale i tk díky moc
Nebo jsem jenom blbej a nedokazel sem to spravne zapsat
V C# to mám napsané takhle:
static bool[] sieve;
static void Main(string[] args) {
int range;
Console.Write("Zadejte rozsah: ");
if (int.TryParse(Console.ReadLine(), out range)) {
sieve = new bool[range];
sieve[0] = true;
sieve[1] = true;
for (int i = 2; i <= Math.Sqrt(sieve.Length); i++) {
if (sieve[i])
continue;
for (int j = 2 * i; j < range; j += i) {
sieve[j] = true;
}
}
}
else {
Console.WriteLine("Musíte zadat číslo!");
}
PrintSieve(sieve);
Console.Read();
}
private static void PrintSieve(bool[] array) {
for (int i = 2; i < array.Length; i++) {
if (!sieve[i])
Console.Write(i + " ");
}
}
V Javě by to mělo být prakticky stejný (asi kromě toho prvního IFu).
jenom co je to out range
Jaktože nepomohlo..?
Je to snad nejjednodušší implementace E. síta, co znám..
Tady to máš v Javě
static boolean[] sieve;
public static void main(String[] args) {
int range;
System.out.print("Zadejte rozsah: ");
Scanner sc = new Scanner(System.in);
range = sc.nextInt();
sieve = new boolean[range];
sieve[0] = true;
sieve[1] = true;
for (int i = 2; i <= Math.sqrt(sieve.length); i++) {
if (sieve[i])
continue;
for (int j = 2 * i; j < range; j += i) {
sieve[j] = true;
}
}
PrintSieve(sieve);
}
private static void PrintSieve(boolean[] array) {
for (int i = 2; i < array.length; i++) {
if (!sieve[i])
System.out.print(i + " ");
}
System.out.println("");
}
Nevim proč nešlo mi odesílat zprávy přepsal sem si to a funguje mi to díky moc
Zobrazeno 14 zpráv z 14.