Avatar
vlastajuracka:

Č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ý
Redaktor
Avatar
Odpovídá na vlastajuracka
Jan Vargovský:

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

 
Nahoru Odpovědět 21.10.2015 22:01
Avatar
vlastajuracka:
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
Člen
Avatar
Odpovídá na vlastajuracka
Atrament:

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:

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

 
Nahoru Odpovědět 22.10.2015 13:49
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na vlastajuracka
David Novák:

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  +1 22.10.2015 17:15
Chyba je mezi klávesnicí a židlí.
Avatar
vlastajuracka:

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

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

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

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

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:

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  +1 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:

jenom co je to out range

 
Nahoru Odpovědět 22.10.2015 20:52
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na vlastajuracka
David Novák:

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:

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:

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.