Java Programma om Prime af te drukken Numbers van 1 naar 100

โšก Slimme samenvatting

Programma om priemgetallen af โ€‹โ€‹te drukken van 1 tot 100 inch Java Het programma scant alle waarden in een bereik en rapporteert de waarden met precies twee delers. Dit artikel legt de definitie, de controlemethode, het complete programma, de zeef van Eratosthenes en een prestatievergelijking met geverifieerde uitvoer uit.

  • ๐Ÿ”ข Definitieregel: Een priemgetal is groter dan 1 en alleen deelbaar door 1 en zichzelf; 0 en 1 zijn dus volledig uitgesloten.
  • ๐Ÿ” Bereikscan: Een buitenste lus doorloopt de waarden van 2 tot de bovengrens en delegeert elke waarde aan een herbruikbare controlemethode.
  • โœ… Booleaanse methode: CheckPrime retourneert false bij de eerste gevonden deler en true wanneer de lus is voltooid zonder een overeenkomst.
  • โˆš Delergrens: Testen tot de helft van de waarde is correct, stop.ping Het nemen van de wortel levert hetzelfde antwoord op, maar dan veel sneller.
  • ๐Ÿงฎ Resultaatset: Er bestaan โ€‹โ€‹precies 25 priemgetallen tussen 1 en 100, eindigend met 97.
  • โšก Zeefmethode: De zeef van Eratosthenes markeert veelvouden in een booleaanse array en heeft een looptijd van O(n log log n).
  • ๐Ÿงช Verificatiepraktijk: Controleer of 2 is inbegrepen en of 1 is uitgesloten voordat u een implementatie vertrouwt.

Prime Numbers 1 tot 100 in Java

Wat is een priemgetal?

A Priemgetal Een priemgetal is een getal dat alleen deelbaar is door รฉรฉn of zichzelf. Het is een natuurlijk getal groter dan รฉรฉn dat niet het product is van twee kleinere natuurlijke getallen. Bijvoorbeeld, 11 is alleen deelbaar door รฉรฉn of zichzelf. Andere priemgetallen zijn 2, 3, 5, 7, 11, 13, 17, enzovoort.

Let op: 0 en 1 zijn geen priemgetallen. 2 is het enige even priemgetal.

Tussen 1 en 100 liggen precies 25 priemgetallen. De onderstaande tabel groepeert ze per decennium, waardoor het patroon van afnemende dichtheid zichtbaar wordt naarmate de waarden toenemen.

Verkrijgbaarheid: Prime Numbers Tellen
1 - 20 2, 3, 5, 7, 11, 13, 17, 19 8
21 - 40 23, 29, 31, 37 4
41 - 60 41, 43, 47, 53, 59 5
61 - 80 61, 67, 71, 73, 79 5
81 - 100 83, 89, 97 3

Prime afdrukken Numbers Tussen 1 en 100 Programma in Java

Hieronder staat de Java programma om priemgetallen van 1 tot 100 af te drukken:

Programmalogica:

  • De belangrijkste methode van de priemgetalprogramma in Java Bevat een lus om de priemgetallen tussen 1 en 100 รฉรฉn voor รฉรฉn te controleren.
  • De hoofdmethode roept de methode aan CheckPrime om te bepalen of een getal een priemgetal is in Java of niet.
  • We moeten een getal, bijvoorbeeld 17, delen door getallen van 2 tot en met 17 en de rest controleren. Als de rest 0 is, is het getal geen priemgetal.
  • Geen enkel getal is deelbaar door meer dan de helft van zichzelf. We hoeven dus alleen maar door het getal dat we moeten controleren/2 te itereren. Als de invoer 17 is, is de helft 8.5, en de lus zal de waarden van 2 tot en met 8 doorlopen.
  • If numberToCheck Als het getal volledig deelbaar is door een ander getal, retourneren we false en wordt de lus afgebroken.
  • If numberToCheck priemgetal is, geven we waar terug.
  • In de hoofdmethode voor priemgetallen 1 tot 100 in Java, controleer of isPrime TRUE en tel de waarde op bij het priemgetal.NumbersString gevonden.
  • Druk ten slotte de priemgetallen van 1 tot 100 af in Java.

Door de controle in een aparte methode onder te brengen, wordt het programma herbruikbaar. Dezelfde CheckPrime-methode kan met elke gewenste bovengrens worden aangeroepen door simpelweg de variabele maxCheck aan te passen.

public class PrimeNumbers {

    public static void main(String[] args) {

        int i;
        int num = 0;
        int maxCheck = 100; // maxCheck limit till which you want to find prime numbers
        boolean isPrime = true;

        //Empty String
        String primeNumbersFound = "";

        //Start loop 2 to maxCheck
        for (i = 2; i <= maxCheck; i++) {
            isPrime = CheckPrime(i);
            if (isPrime) {
                primeNumbersFound = primeNumbersFound + i + " ";
            }
        }
        System.out.println("Prime numbers from 1 to " + maxCheck + " are:");
        // Print prime numbers from 1 to maxCheck
        System.out.println(primeNumbersFound);
    }
    public static boolean CheckPrime(int numberToCheck) {
        int remainder;
        for (int i = 2; i <= numberToCheck / 2; i++) {
            remainder = numberToCheck % i;
            //if remainder is 0 then the number is not prime and we break the loop. Else continue the loop
            if (remainder == 0) {
                return false;
            }
        }
        return true;

    }

}

Verwachte resultaten:

De uitvoer van het priemgetal tussen 1 en 100 in de Java programma zal zijn:

Prime numbers from 1 to 100 are:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

De waarde 2 wordt doorgegeven omdat de voorwaarde in de binnenste lus niet wordt voldaan. i <= 2 / 2 evalueert naar 2 <= 1, wat meteen onwaar is, dus de methode retourneert waar zonder enige deling.

Geoptimaliseerde versie met behulp van de wortelgrens

Delen tot de helft van het getal is correct, maar voert onnodig werk uit. Delers komen altijd in paren voor rond de wortel, dus elke factor boven โˆšn heeft een partner eronder die al is gecontroleerd.

public class PrimeNumbersOptimized {

    public static void main(String[] args) {
        int maxCheck = 100;
        int count = 0;
        StringBuilder result = new StringBuilder();

        for (int i = 2; i <= maxCheck; i++) {
            if (isPrime(i)) {
                result.append(i).append(" ");
                count++;
            }
        }

        System.out.println("Prime numbers from 1 to " + maxCheck + " are:");
        System.out.println(result.toString().trim());
        System.out.println("Total primes found: " + count);
    }

    public static boolean isPrime(int n) {
        if (n <= 1) return false;
        if (n == 2) return true;
        if (n % 2 == 0) return false;

        // test only odd divisors up to the square root
        for (int i = 3; i * i <= n; i += 2) {
            if (n % i == 0) return false;
        }
        return true;
    }
}

Output:

Prime numbers from 1 to 100 are:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Total primes found: 25

๐Ÿ’กTip: StringBuilder vervangt herhaalde stringconcatenatie binnen de lus. Elke += Met een String wordt een nieuw object gecreรซerd, dat meetbaar wordt zodra de bovengrens enkele duizenden bereikt.

Print Prime Numbers Met behulp van de zeef van Eratosthenes

Wanneer elk priemgetal in een bereik nodig is, is proefdeling niet de juiste methode. De zeef van Eratosthenes bouwt een booleaanse matrix op, markeert de veelvouden van elk priemgetal als samengesteld en leest af wat er ongemarkeerd overblijft.

De methode werkt in drie stappen:

  1. Maak een booleaanse array van grootte n+1 en ga ervan uit dat elke index vanaf 2 een priemgetal is.
  2. Beginnend bij 2, markeer elk veelvoud van het huidige priemgetal als samengesteld.
  3. Ga door naar de volgende niet-gemarkeerde index en herhaal dit totdat de wortel van n is bereikt.
import java.util.Arrays;

public class SieveOfEratosthenes {

    public static void main(String[] args) {
        int n = 100;
        boolean[] composite = new boolean[n + 1];

        for (int p = 2; p * p <= n; p++) {
            if (!composite[p]) {
                // start at p*p because smaller multiples are already marked
                for (int multiple = p * p; multiple <= n; multiple += p) {
                    composite[multiple] = true;
                }
            }
        }

        StringBuilder result = new StringBuilder();
        for (int i = 2; i <= n; i++) {
            if (!composite[i]) {
                result.append(i).append(" ");
            }
        }

        System.out.println("Prime numbers from 1 to " + n + " are:");
        System.out.println(result.toString().trim());
    }
}

Output:

Prime numbers from 1 to 100 are:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

Vergelijking van de drie benaderingen

Alle drie de programma's printen dezelfde 25 waarden, dus de keuze hangt volledig af van de grootte van het bereik.

Aanpak Tijdcomplexiteit Extra geheugen Beste bereik
Proefdeling naar n/2 O(nยฒ) O (1) Tot enkele duizenden
Proefdeling naar โˆšn O(nโˆšn) O (1) Tot wel een paar honderdduizend
Zeef van Eratosthenes O(n log log n) O (n) Miljoenen waarden

Bekijk ons โ€‹โ€‹programma om te ontdekken priemgetallen van elk willekeurig ingevoerd getal wanneer een enkele waarde in plaats van een bereik moet worden getest. Voor meer oefeningen met lussen, raadpleeg de volgende informatie. Fibonacci-reeks in Java Java palindroomprogrammaen Bubble Sorteeralgoritme in JavaDe booleaanse array die door de zeef wordt gebruikt, wordt verder uitgelegd in Java arrays.

Veelgestelde vragen

Er zijn er precies 25. De reeks begint bij 2 en eindigt bij 97, en de dichtheid neemt gestaag af naarmate de waarden groter worden.

De voorwaarde in de binnenste lus wordt 2 <= 1, wat direct onwaar is, waardoor er geen deling plaatsvindt en de methode waar retourneert. Dat ene geval is het waard om in elke implementatie te testen.

Wijzig de variabele maxCheck naar 500. Om boven de 1 te beginnen, pas je in plaats daarvan de beginwaarde van de teller van de buitenste lus aan en laat je de controlemethode ongewijzigd.

Elk kleiner veelvoud van p bevat al een kleinere priemfactor en is tijdens een eerdere stap gemarkeerd. Door bij p in het kwadraat te beginnen, wordt herhaling van dat werk voorkomen.

Ze retourneren doorgaans een proefdeling, tenzij in de opdracht een groot bereik of een bepaalde prestatie wordt vermeld. Het opgeven van de bovengrens in de aanvraag resulteert meestal in een zeef.

Priemgetallen worden gekozen als groottes voor hashtabellen en feature buckets omdat ze sleutels gelijkmatig verdelen en botsingen verminderen. Ze dienen ook als initialisatiebron voor hashfuncties die worden gebruikt bij feature vectorisatie.

Vat dit bericht samen met: