IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Eratosthenovo síto

Aktivity
Avatar
vlastajuracka:21.10.2015 21:58

Čaues lidi chtěl bych vytvořit Eratosthenovo síto ale uplně nějak obyčejně (tzn. pole,podminky,cy­kly) už se tim trápim opravdu dlouho a vůbec mi to nejde... byl bych rád za každou pomoc, radu. dík moc :)

 
Odpovědět
21.10.2015 21:58
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na vlastajuracka
Jan Vargovský:21.10.2015 22:01

Tu předhoď něco co už máš.

 
Nahoru Odpovědět
21.10.2015 22:01
Avatar
vlastajuracka:21.10.2015 22:03
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]);
            }
        }
    }

}
Editováno 21.10.2015 22:04
 
Nahoru Odpovědět
21.10.2015 22:03
Avatar
Atrament
Tvůrce
Avatar
Odpovídá na vlastajuracka
Atrament:22.10.2015 0:40

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í.

 
Nahoru Odpovědět
22.10.2015 0:40
Avatar
vlastajuracka:22.10.2015 13:49

Ja vim ale píšu že to použít nemůžu

 
Nahoru Odpovědět
22.10.2015 13:49
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na vlastajuracka
David Novák:22.10.2015 17:15

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 :)

Nahoru Odpovědět
22.10.2015 17:15
Chyba je mezi klávesnicí a židlí.
Avatar
vlastajuracka:22.10.2015 19:46

Díky moc určitě mi to pomůže :)

 
Nahoru Odpovědět
22.10.2015 19:46
Avatar
vlastajuracka:22.10.2015 20:29

Tk bohužel příliš nepomohlo.... Ale i tk díky moc :)

 
Nahoru Odpovědět
22.10.2015 20:29
Avatar
vlastajuracka:22.10.2015 20:37

Nebo jsem jenom blbej a nedokazel sem to spravne zapsat :D

 
Nahoru Odpovědět
22.10.2015 20:37
Avatar
Hit
Člen
Avatar
Odpovídá na vlastajuracka
Hit:22.10.2015 20:46

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).

Editováno 22.10.2015 20:48
Nahoru Odpovědět
22.10.2015 20:46
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
vlastajuracka:22.10.2015 20:52

jenom co je to out range

 
Nahoru Odpovědět
22.10.2015 20:52
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na vlastajuracka
David Novák:22.10.2015 21:14

Jaktože nepomohlo..? :D
Je to snad nejjednodušší implementace E. síta, co znám..

Nahoru Odpovědět
22.10.2015 21:14
Chyba je mezi klávesnicí a židlí.
Avatar
Hit
Člen
Avatar
Odpovídá na vlastajuracka
Hit:22.10.2015 21:15

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("");
}
Nahoru Odpovědět
22.10.2015 21:15
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
vlastajuracka:22.10.2015 21:36

Nevim proč nešlo mi odesílat zprávy přepsal sem si to a funguje mi to díky moc :)

 
Nahoru Odpovědět
22.10.2015 21:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.